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

# GearmanClient::addTaskBackground

(PECL gearman >= 0.5.0)

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

### Описание

public function GearmanClient::addTaskBackground(
string `$function_name`,
string|int|float `$workload`,
mixed `$context` = `null`,
?string `$unique_key` = `null`
): GearmanTask|false

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

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

`function_name`
  Зарегистрированная функция, которую вызывает рабочий процесс
`workload`
  Сериализованные данные, которые подлежат обработке
`context`
  Контекст приложения, который связывается с задачей
`unique_key`
  Уникальный 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
    Выполнено

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

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

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open