GearmanClient::doNormal
(Информация о версии неизвестна, возможно, только в SVN)
GearmanClient::doNormal — Выполняет одиночное задание и возвращает результат
Описание
$function_name
, string $workload
[, string $unique
] )Выполняет одиночное задание и возвращает строковое представление результата. Формат возвращаемого результата определяют объекты GearmanClient и GearmanWorker.
Список параметров
-
function_name
-
Зарегистрированная функция, вызываемая рабочим процессом
-
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
Смотрите также
- GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
- GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
- GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
- GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
- GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме
- Функция GearmanClient::addOptions() - Добавить клиентские опции
- Функция GearmanClient::addServer() - Добавить сервер задач для клиента
- Функция GearmanClient::addServers() - Добавить список серверов задач для клиента
- Функция GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
- Функция GearmanClient::addTaskBackground() - Добавить фоновую задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskStatus() - Добавить задачу для получения статуса
- Функция GearmanClient::clearCallbacks() - Очистить все функции обратного вызова данной задачи
- Функция GearmanClient::clone() - Создать копию объекта GearmanClient
- Функция GearmanClient::__construct() - Создать экземпляр GearmanClient
- Функция GearmanClient::context() - Возвращает контекст приложения
- Функция GearmanClient::data() - Возвращает данные приложения (функция устарела)
- Функция GearmanClient::do() - Выполняет одну задачу и возвращает результат [Устаревший метод]
- Функция GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
- Функция GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
- Функция GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
- Функция GearmanClient::doJobHandle() - Получить дескриптор выполняющейся задачи
- Функция GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
- Функция GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме
- Функция GearmanClient::doNormal() - Выполняет одиночное задание и возвращает результат
- Функция GearmanClient::doStatus() - Получение статуса обработки задания
- Функция GearmanClient::echo() - Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]
- Функция GearmanClient::error() - Вернуть строку ошибки для последней встретившейся ошибки
- Функция GearmanClient::getErrno() - Получить значение errno
- Функция GearmanClient::jobStatus() - Получение статуса выполнения фонового задания
- Функция GearmanClient::ping() - Отправляет данные на все сервера и смотрит, какие из них выведут эти данные
- Функция GearmanClient::removeOptions() - Удалить клиентские опции
- Функция GearmanClient::returnCode() - Получить последний возвращённый код Gearman
- Функция GearmanClient::runTasks() - Запустить список задач в параллельном режиме
- Функция GearmanClient::setClientCallback() - Установить функцию обратного вызова, когда есть пакет данных для задачи (устаревший метод)
- Функция GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
- Функция GearmanClient::setContext() - Установить данные приложения
- Функция GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
- Функция GearmanClient::setData() - Установить данные приложения (устаревший метод)
- Функция GearmanClient::setDataCallback() - Задает callback-функцию для обработки переданных данных
- GearmanClient::setExceptionCallback
- GearmanClient::setFailCallback
- Функция GearmanClient::setOptions() - Задание настроек клиента
- Функция GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
- Функция GearmanClient::setTimeout() - Установка таймаута для операций ввода/вывода
- Функция GearmanClient::setWarningCallback() - Задание callback-функции, обслуживающей предупреждения обработчика заданий
- GearmanClient::setWorkloadCallback
- Функция GearmanClient::timeout() - Получение значения таймаута операций ввода/вывода
Коментарии
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
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.