Apache Thrift: различия между версиями

Содержимое удалено Содержимое добавлено
м →‎Источники: clean up с помощью AWB
м <source> -> <syntaxhighlight> (phab:T237267)
 
Строка 8:
 
Для начала давайте зададим пространство имен.
<sourcesyntaxhighlight lang="php">
namespace php hello
</syntaxhighlight>
</source>
<sub>
Пространства имен определяются для каждого языка — в данном примере, только объекты в файле PHP будут с префиксом «hello_».
Строка 17:
Объект <code>User</code> содержит поля <code>firstname</code> и <code>lastname</code> строкового типа, <code>user_id</code> типа <code>integer</code>, <code>active</code> типа <code>boolean</code> и <code>sex</code> нашего собственного типа перечисления <code>(enum)</code>.
Описание такого объекта является очень простым. Для начала опишем наш собственный тип <code>enum</code>.
<sourcesyntaxhighlight lang="cpp">
enum SexType {
MALE = 1,
FEMALE = 2
}
</syntaxhighlight>
</source>
После чего опишем объект User.
<sourcesyntaxhighlight lang="cpp">
struct User {
1: string firstname,
Строка 33:
6: optional string description
}
</syntaxhighlight>
</source>
Как вы, наверное, уже заметили, мы пронумеровали параметры, поскольку того требует синтаксис Thrift. По умолчанию все параметры являются обязательными, но вы можете сделать их необязательными (с помощью ключевого слова <code>optional</code>), а также установить их значения по умолчанию.
Нам так же надо объявить исключение. Оно будет вызываться, когда передается неправильной параметр (в нашем примере это может произойти, если, например, <code>user_id</code> будет отрицательным).
<sourcesyntaxhighlight lang="c">
exception InvalidValueException {
1: i32 error_code,
2: string error_msg
}
</syntaxhighlight>
</source>
Теперь пришло время объявить службу. Службы — это основная вещь, проводящая сериализацию объектов для их доступа в различных программах. Объявим нашу простую службу с помощью ключевого слова <code>service</code>
<sourcesyntaxhighlight lang="c">
service UserManager {
void ping(),
Строка 50:
oneway void clear_list()
}
</syntaxhighlight>
</source>
<sub>
При объявлении метода правила нумерации параметров сохраняются. Как вы можете видеть, объявление метода очень похоже на C.
Строка 63:
=== Генерируем файлы ===
Теперь мы можем сгенерировать PHP и Python файлы, которые будут использоваться на клиентской стороне и на сервере, соответственно. Это довольно просто:
<sourcesyntaxhighlight lang="c">
thrift -r --gen php hello.thrift
thrift -r --gen py hello.thrift
</syntaxhighlight>
</source>
В директориях <code>gen-php</code> и <code>gen-py</code> мы получили PHP и Python файлы, соответственно. Теперь давайте создадим сервер. Создаем файл, назовем его, например, <code>python_server.py</code>. Не забудьте сделать его исполняемым, с помощью команды:
<sourcesyntaxhighlight lang="c">
chmod +x ./python_server.py
</syntaxhighlight>
</source>
В этот файл мы запихнем все необходимые библиотеки, определим класс для обработки запросов с такими же именами методов, как и определенный в thrift-файлах. Так как код говорит сам за себя, приведем его ниже.
<sourcesyntaxhighlight lang="python">
#!/usr/bin/env python
 
Строка 136:
server.serve()
print 'done.'
</syntaxhighlight>
</source>
<sub>
Как вы видите, этот скрипт сохраняет пользователей в список <code>users</code>. Методы позволяют проводить нам некоторые манипуляции с содержимым списка.
Строка 142:
<br /><br />
Следующую строку обязательно надо принять во внимание:
<sourcesyntaxhighlight lang="python">
sys.path.append('./gen-py')
</syntaxhighlight>
</source>
Это путь к директории <code>gen-py</code>, относительно того места, откуда будет запущен скрипт (по сути, лучшим решением является указать здесь абсолютный путь).
<br />
Вы можете запустить ваш скрипт командой:
<sourcesyntaxhighlight lang="c">
./python_server.py
</syntaxhighlight>
</source>
<br />
Однако, вы можете столкнуться со следующей ошибкой:
Строка 156:
<br />
Чтобы это исправить, вам надо перейти в директорию <code>lib/py</code> и запустить команду установки thrift модуля в вашу python библиотеку:
<sourcesyntaxhighlight lang="c">
sudo python setup.py install
</sourcesyntaxhighlight><br />
Перед тем, как создать PHP скрипт подготовим структуру файлов. Для начала выберем директорию, которая доступна из вашего Apache или любого другого http-сервера. Затем создадим директорию <code>src</code> и поместим туда все файлы и директории из директории <code>lib/php/src</code> в пакете Thrift. Создадим так же директорию <code>src/packages</code> и поместим туда директорию <code>hello</code> из директории <code>gen-php</code> (созданную Thrift’ом). В корневую директорию поместите ваш PHP-файл (то есть «hello.php»). В этот скрипт необходимо вставить Thrift-библиотеки, ваш автоматически сгенерированный файл с классом <code>UserManager</code>, установить соединения с сервером и выполнить обмен объектами.
<sourcesyntaxhighlight lang="php">
<?php
$GLOBALS['THRIFT_ROOT'] = 'src';
Строка 204:
 
?>
</sourcesyntaxhighlight><br />
Теперь запустите свой сервер (если, конечно, вы его еще не запустили) и откройте ваш PHP-файл в браузере.
Вы должны получить следующий результат:
<sourcesyntaxhighlight lang="php">
user added succesfully
object(hello_User)[7]
Строка 217:
public 'description' => null
no firstname exception
</syntaxhighlight>
</source>
<sub>
Результат <code>var_dump'а</code> может отличаться, если у вас не установлен <code>xdebug</code>
Строка 223:
Когда вы будете анализировать содержимое сценария PHP, вы заметите, что первый пользователь был добавлен успешно, а на второй попытке с различными данными будет поймано исключение <code>(exception)</code>.
В консоли это будет выглядеть так:
<sourcesyntaxhighlight lang="c">
home-debian:~/www/thrift-test/server# ./python_server.py
Starting the server...
Строка 232:
[User(user_id=1, description=None, firstname='John', lastname='Smith', sex=1, active=True)]
[]
</syntaxhighlight>
</source>
 
== Источники ==