CakeFest 2024: The Official CakePHP Conference

GearmanClient::doNormal

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

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

Описание

public 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

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

add a note

User Contributed Notes 2 notes

up
0
stanislav dot reshetnev at gmail dot com
9 years ago
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.
up
-2
fastest963 at gmail dot com
11 years ago
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
To Top