Наша группа в телеграмм для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov

GearmanClient::addTaskBackground

(PECL gearman >= 0.5.0)

GearmanClient::addTaskBackground — Добавить фоновую задачу для работы в параллельном режиме


Описание

public GearmanTask GearmanClient::addTaskBackground ( string $function_name , string $workload [, mixed &$context [, string $unique ]] )

Добавляет фоновую задачу для параллельной работы с другими задачами. Вызовите этот метод для всех задач, которые будут работать параллельно, а затем вызовите GearmanClient::runTasks() для выполнения работ.


Список параметров

function_name -

Зарегистрированная функция, вызываемая рабочим процессом

workload -

Сериализованные данные, подлежащие обработке

context -

Контекст приложения, связываемый с задачей

unique -

Уникальный ID, назначаемый определенной задаче


Возвращаемые значения

Объект GearmanTask или FALSE, если задача не может быть добавлена.


Примеры

Пример #1 Две задачи, одна в фоновом режиме другая нет

Этот пример иллюстрирует различие между выполнением фоновой задачи и нормальной задачей. Клиент добавляет две задачи для выполнения одних и тех же функций, но одна добавлена с помощью addTaskBackground(). Обратный вызов установлен так, чтобы выполнение задания можно было проследить. Простой рабочий с искусственной задержкой сообщает статус выполнения задания, и клиент понимает это посредством обратного вызова. Два рабочих запущены для этого примера. Обратите внимание, что фоновая задача не показывается в клиентском выводе.


# Клиентский скрипт
# Создание нашего клиента
$gmc= new GearmanClient();
# Добавление сервера задач по умолчанию
$gmc->addServer();
# Установка нескольких обратных вызовов. Таким образом, мы сможем отслеживать выполнение
$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";
}

# Скрипт работника
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
Выполнено


Смотрите также

  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
  • GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::runTasks() - Запустить список задач в параллельном режиме


Описание класса gearmanclient, примеры использования класса gearmanclient.

Описание на ru2.php.net
Описание на php.ru

.

Популярное:


Содержание: