GearmanClient
используется для отправки задания. Обычно это делается с веб-страницы или из сценария, предназначенного для чтения списка задач, подлежащих отправке.
GearmanWorker
предназначен для настройки таким образом, чтобы одновременно можно было запускать много параллельных «рабочих». Логично, что то, что делает работник, должно представлять собой единую атомарную единицу работы. Это может означать выполнение одного преобразования объекта в другой и сохранение его обратно в базу данных или сборку и отправку html-письма одному пользователю. $function_name
- это функция, которая принимает один аргумент, который является GearmanJob
объектом.
Итак, ваш скрипт контроллера может выглядеть примерно так:
$gearman_params = json_encode( array(
'id' => 77,
'options' => array('push' => true),
) );
$client = new GearmanClient();
$client->doBackground( "widgetize", $gearman_params );
Тогда ваш работник сделает что-то подобное.
$gmworker = GearmanWorker;
$gmworker->addFunction( "widgetize", "widgetize" );
while( $gmworker->work() ) {
if ( $gmworker->returnCode() !== GEARMAN_SUCCESS ) {
echo "Worker Terminated." . PHP_EOL ;
break;
}
} // while *working*
function widgetize( $job ) {
$workload = json_decode( $job->workload() );
/* do stuff */
}
Несколько вещей, которые нужно иметь в виду:
- Рабочий сценарий спроектирован как долго выполняемый сценарий, поэтому цикл
while
. Убедитесь, что вы правильно установили время ожидания и ограничения памяти.
- Хорошей практикой также является предоставление работнику предела пробега. Например, разрешите рабочему запускаться только несколько раз, а затем
exit;
PHP по-прежнему отстой с использованием памяти, и может быть трудно определить, когда рабочий будет убит, потому что ему не хватило памяти.
- В том же духе лучше всего спроектировать рабочих, чтобы они были идемпотентными, поэтому рабочие места могут быть повторно переданы рабочим, если они потерпят неудачу.
- Клиент может отправлять задания работнику с разными приоритетами, и их необязательно запускать в фоновом режиме, как в примере выше. Их можно запустить так, чтобы клиент блокировал.