Note that this isn't blocking -- that do() will return as soon as the job is accepted by the Gearman jobserver.
That lets you do..while until the return code is success or failure as you see in the examples.
(PECL gearman >= 0.5.0)
GearmanClient::do — Выполняет одну задачу и возвращает результат [Устаревший метод]
Метод GearmanClient::do() устарел, начиная с pecl/gearman 1.0.0. Используйте GearmanClient::doNormal().
function_name
Зарегистрированная функция, которую вызывает рабочий процесс
workload
Сериализованные данные, которые подлежат обработке
unique
Уникальный ID, который назначается конкретной задаче
Результат выполнения задачи в виде строки.
Пример #1 Простое представление задания с непосредственным возвратом
<?php
# Код клиента
echo "Начало\n";
# Создание клиента
$gmclient= new GearmanClient();
# Указание сервера по умолчанию (localhost).
$gmclient->addServer();
echo "Отправка задания\n";
$result = $gmclient->doNormal("reverse", "Hello!");
echo "Успешно: $result\n";
?>
<?php
echo "Начало\n";
# Создание экземпляра обработчика
$gmworker= new GearmanWorker();
# Указание сервера по умолчанию (localhost).
$gmworker->addServer();
# Регистрация функции "reverse" на сервере. Изменение функции обработчика на
# "reverse_fn_fast" для более быстрой обработки без вывода.
$gmworker->addFunction("reverse", "reverse_fn");
print "Ожидание задания...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}
function reverse_fn($job)
{
return strrev($job->workload());
}
?>
Вывод приведённого примера будет похож на:
Начало Отправка задания Успешно: !olleH
Пример #2 Передача задания и получение инкрементного состояния
Отправляется задание и устанавливается цикл для получения информации об изменении статуса. У обработчика указана искусственная задержка для моделирования длительного выполнения задания и задана отправка состояния и данных во время обработки. Каждый последующий вызов GearmanClient::do() выводит информацию о статусе выполнения текущего задания.
<?php
# Код клиента
# Создание экземпляра клиента Gearman
$gmclient= new GearmanClient();
# Указание сервера по умолчанию (localhost).
$gmclient->addServer();
echo "Отправка задания\n";
# Отправка задания reverse
do
{
$result = $gmclient->doNormal("reverse", "Hello!");
# Проверка на различные возвращаемые форматы и ошибки
switch($gmclient->returnCode())
{
case GEARMAN_WORK_DATA:
echo "Данные: $result\n";
break;
case GEARMAN_WORK_STATUS:
list($numerator, $denominator)= $gmclient->doStatus();
echo "Статус: $numerator/$denominator выполнено\n";
break;
case GEARMAN_WORK_FAIL:
echo "Ошибка\n";
exit;
case GEARMAN_SUCCESS:
break;
default:
echo "RET: " . $gmclient->returnCode() . "\n";
echo "Error: " . $gmclient->error() . "\n";
echo "Errno: " . $gmclient->getErrno() . "\n";
exit;
}
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);
echo "Успешно: $result\n";
?>
<?php
# Код обработчика
echo "Начало\n";
# Создание экземпляра обработчика.
$gmworker= new GearmanWorker();
# Указание сервера по умолчанию (localhost).
$gmworker->addServer();
# Регистрация функции "reverse" на сервере.
$gmworker->addFunction("reverse", "reverse_fn");
print "Ожидание задания...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}
function reverse_fn($job)
{
echo "Полученное задание: " . $job->handle() . "\n";
$workload = $job->workload();
$workload_size = $job->workloadSize();
echo "Рабочая нагрузка: $workload ($workload_size)\n";
# Данный цикл не является необходимым, только иллюстрирует процесс
for ($x= 0; $x < $workload_size; $x++)
{
echo "Отправка статуса: " + $x + 1 . "/$workload_size выполнено\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}
$result= strrev($workload);
echo "Результат: $result\n";
# Возврат результата, отправляемого клиенту
return $result;
}
?>
Вывод приведённого примера будет похож на:
Вывод обработчика:
Начало Ожидание задания... Полученное задание: H:foo.local:106 Рабочая нагрузка: Hello! (6) 1/6 выполнено 2/6 выполнено 3/6 выполнено 4/6 выполнено 5/6 выполнено 6/6 выполнено Результат: !olleH
Вывод клиента:
Начало Отправка задания Статус: 1/6 выполнено Данные: H Статус: 2/6 выполнено Данные: e Статус: 3/6 выполнено Данные: l Статус: 4/6 выполнено Данные: l Статус: 5/6 выполнено Данные: o Статус: 6/6 выполнено Данные: ! Успешно: !olleH
Note that this isn't blocking -- that do() will return as soon as the job is accepted by the Gearman jobserver.
That lets you do..while until the return code is success or failure as you see in the examples.