(PECL gearman >= 0.5.0)
GearmanClient::addTaskBackground — Добавить фоновую задачу для работы в параллельном режиме
$function_name
, string $workload
[, mixed &$context
[, string $unique
]] ) : GearmanTaskДобавляет фоновую задачу для параллельной работы с другими задачами. Вызовите этот метод для всех задач, которые будут работать параллельно, а затем вызовите GearmanClient::runTasks() для выполнения работ.
function_name
Зарегистрированная функция, вызываемая рабочим процессом
workload
Сериализованные данные, подлежащие обработке
context
Контекст приложения, связываемый с задачей
unique
Уникальный ID, назначаемый определенной задаче
Объект GearmanTask или FALSE
, если задача не может быть добавлена.
Пример #1 Две задачи, одна в фоновом режиме, а другая нет
Этот пример иллюстрирует различие между выполнением фоновой задачи и обычной задачей. Клиент добавляет две задачи для выполнения одних и тех же функций, но одна добавлена с помощью addTaskBackground(). Callback-функция установлена так, чтобы выполнение задания можно было проследить. Простой обработчик с искусственной задержкой сообщает статус выполнения задания, и клиент понимает это посредством вызова callback-функции. Два обработчика запущены для этого примера. Обратите внимание, что фоновая задача не показывается в клиентском выводе.
<?php
# Клиентский скрипт
# Создание нашего клиента
$gmc= new GearmanClient();
# Добавление сервера задач по умолчанию
$gmc->addServer();
# Установка нескольких callback-функций. Таким образом, мы сможем отслеживать выполнение
$gmc->setCompleteCallback("reverse_complete");
$gmc->setStatusCallback("reverse_status");
# Добавление задачи для функции reverse
$task= $gmc->addTask("reverse", "Hello World!", null, "1");
# Добавление другой задачи, но она предназначена для запуска в фоновом режиме
$task= $gmc->addTaskBackground("reverse", "!dlroW olleH", null, "2");
if (! $gmc->runTasks())
{
echo "Ошибка " . $gmc->error() . "\n";
exit;
}
echo "Выполнено\n";
function reverse_status($task)
{
echo "Статус: " . $task->unique() . ", " . $task->jobHandle() . " - " . $task->taskNumerator() .
"/" . $task->taskDenominator() . "\n";
}
function reverse_complete($task)
{
echo "Завершено: " . $task->unique() . ", " . $task->data() . "\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:65 Рабочая нагрузка: !dlroW olleH (12) 1/12 выполнено Полученная задача: H:foo.local:66 Рабочая нагрузка: Hello World! (12) Отправка статуса: 1/12 выполнено Отправка статуса: 2/12 выполнено Отправка статуса: 2/12 выполнено Отправка статуса: 3/12 выполнено Отправка статуса: 3/12 выполнено Отправка статуса: 4/12 выполнено Отправка статуса: 4/12 выполнено Отправка статуса: 5/12 выполнено Отправка статуса: 5/12 выполнено Отправка статуса: 6/12 выполнено Отправка статуса: 6/12 выполнено Отправка статуса: 7/12 выполнено Отправка статуса: 7/12 выполнено Отправка статуса: 8/12 выполнено Отправка статуса: 8/12 выполнено Отправка статуса: 9/12 выполнено Отправка статуса: 9/12 выполнено Отправка статуса: 10/12 выполнено Отправка статуса: 10/12 выполнено Отправка статуса: 11/12 выполнено Отправка статуса: 11/12 выполнено Отправка статуса: 12/12 выполнено Отправка статуса: 12/12 выполнено Результат: !dlroW olleH Результат: Hello World!
Клиент выводит:
Статус: 1, H:foo.local:66 - 1/12 Статус: 1, H:foo.local:66 - 2/12 Статус: 1, H:foo.local:66 - 3/12 Статус: 1, H:foo.local:66 - 4/12 Статус: 1, H:foo.local:66 - 5/12 Статус: 1, H:foo.local:66 - 6/12 Статус: 1, H:foo.local:66 - 7/12 Статус: 1, H:foo.local:66 - 8/12 Статус: 1, H:foo.local:66 - 9/12 Статус: 1, H:foo.local:66 - 10/12 Статус: 1, H:foo.local:66 - 11/12 Статус: 1, H:foo.local:66 - 12/12 Завершено: 1, !dlroW olleH Выполнено