CakeFest 2024: The Official CakePHP Conference

GearmanClient::do

(PECL gearman >= 0.5.0)

GearmanClient::doВыполняет одну задачу и возвращает результат [Устаревший метод]

Описание

public GearmanClient::do(string $function_name, string $workload, string $unique = ?): string

Метод GearmanClient::do() устарел, начиная с pecl/gearman 1.0.0. Используйте GearmanClient::doNormal().

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

function_name

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

workload

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

unique

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

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

Результат выполнения задачи в виде строки.

Примеры

Пример #1 Простое представление задания с непосредственным возвратом

<?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
"return_code: " . $gmworker->returnCode() . "\n";
break;
}
}

function
reverse_fn($job)
{
return
strrev($job->workload());
}

?>

Вывод приведённого примера будет похож на:

Начало
Отправка задания
Успешно: !olleH

Пример #2 Передача задания и получение инкрементного состояния

Отправляется задание и устанавливается цикл для получения информации об изменении статуса. У обработчика указана искусственная задержка для моделирования длительного выполнения задания и задана отправка состояния и данных во время обработки. Каждый последующий вызов GearmanClient::do() выводит информацию о статусе выполнения текущего задания.

<?php

# Код клиента

# Создание экземпляра клиента Gearman
$gmclient= new GearmanClient();

# Указание сервера по умолчанию (localhost).
$gmclient->addServer();

echo
"Отправка задания\n";

# Отправка задания reverse
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 выполнено\n";
break;
case
GEARMAN_WORK_FAIL:
echo
"Ошибка\n";
exit;
case
GEARMAN_SUCCESS:
break;
default:
echo
"RET: " . $gmclient->returnCode() . "\n";
echo
"Error: " . $gmclient->error() . "\n";
echo
"Errno: " . $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
"return_code: " . $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 1 note

up
0
Shane Harter
13 years ago
Note that this isn't blocking -- that do() will return as soon as the job is accepted by the Gearman jobserver.

That lets you do..while until the return code is success or failure as you see in the examples.
To Top