Выполняет одиночное задание и возвращает результат

# GearmanClient::doNormal

(No version information available, might only be in Git)

GearmanClient::doNormal — Выполняет одиночное задание и возвращает результат

### Описание

public function GearmanClient::doNormal(string `$function`, string `$workload`, ?string `$unique` = `null`): string

Выполняет одиночное задание и возвращает строковое представление результата. Формат возвращаемого результата определяют объекты 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

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

- GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
- GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
- GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
- GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
- GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме

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