doNormal don't work in version php_gearman 0.8.3:
PHP Fatal error: Call to undefined method GearmanClient::doNormal()
But it exist in version 1.1.2.
(No version information available, might only be in Git)
GearmanClient::doNormal — Выполняет одиночное задание и возвращает результат
Выполняет одиночное задание и возвращает строковое представление результата. Формат возвращаемого результата определяют объекты GearmanClient и GearmanWorker.
function
Зарегистрированная функция, которую вызывает рабочий процесс
workload
Сериализованные данные, которые подлежат обработке
unique
Уникальный ID, который назначается конкретной задаче
Строка, представляющая результат выполнения задания.
Пример #1 Выполнение простого задания с немедленным возвратом
<?php
?>
<?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 "Код возврата: " . $gmworker->returnCode() . "\n";
break;
}
}
function reverse_fn($job)
{
return strrev($job->workload());
}
?>
Вывод приведённого примера будет похож на:
Запуск Отправка задания Задание выполнено: !olleH
Пример #2 Отправка задания на обработку и мониторинг состояния
После отправки задания скрипт в цикле запрашивает текущий прогресс обработки. В обработчик введена искусственная задержка, чтобы смоделировать долго выполняющееся задание. Обработчик посылает клиенту своё текущее состояние, как только завершена обработка очередной порции данных. Последовательные вызовы GearmanClient::doNormal() запрашивают текущее состояние выполняющегося задания.
<?php
# Код клиента
# Создание клиента.
$gmclient= new GearmanClient();
# Добавление сервера по умолчанию (localhost).
$gmclient->addServer();
echo "Отправка задания\n";
# Отправка задания перевернуть строку
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 complete\n";
break;
case GEARMAN_WORK_FAIL:
echo "Ошибка\n";
exit;
case GEARMAN_SUCCESS:
break;
default:
echo "Код возврата: " . $gmclient->returnCode() . "\n";
echo "Ошибка: " . $gmclient->error() . "\n";
echo "Номер ошибки: " . $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 "Код возврата: " . $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
doNormal don't work in version php_gearman 0.8.3:
PHP Fatal error: Call to undefined method GearmanClient::doNormal()
But it exist in version 1.1.2.
do() or doNormal() will block until the job is accepted by the worker. Looping is only necessary if you care about the response from the job. Use setTimeout() to control how long PHP will block.
If it does timeout, it throws a PHP Warning:
PHP Warning: GearmanClient::do(): _client_do(GEARMAN_TIMEOUT) occured during gearman_client_run_tasks() -> libgearman/client.cc:174