PHP Conference Nagoya 2025

GearmanClient::addTask

(PECL gearman >= 0.5.0)

GearmanClient::addTaskДобавить задачу, которая будет выполнена в параллельном режиме

Описание

public GearmanClient::addTask(
    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 Основное представление двух задач

<?php

# Создаём нашего клиента
$gmclient= new GearmanClient();

# Добавляем сервер задач по умолчанию
$gmclient->addServer();

# Устанавливаем функцию, которая будет вызвана по завершению работы
$gmclient->setCompleteCallback("complete");

# Добавляем задачу для выполнения функции reverse, переворачивающей строку "Hello World!"
$gmclient->addTask("reverse", "Hello World!", null, "1");

# Добавляем другую задачу, для выполнения функции reverse, переворачивающей строку "!dlroW olleH"
$gmclient->addTask("reverse", "!dlroW olleH", null, "2");

# Выполняем задачи
$gmclient->runTasks();

function
complete($task)
{
print
"Выполнено: " . $task->unique() . ", " . $task->data() . "\n";
}

?>

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

Выполнено: 2, Hello World!
Выполнено: 1, !dlroW olleH

Пример #2 Основное представление двух задач с передачей контекста приложения

<?php

$client
= new GearmanClient();
$client->addServer();

# Устанавливаем функцию, которая будет вызвана по завершению работы
$client->setCompleteCallback("reverse_complete");

# Добавим несколько задач и местоположение результатов
$results = array();
$client->addTask("reverse", "Hello World!", $results, "t1");
$client->addTask("reverse", "!dlroW olleH", $results, "t2");

$client->runTasks();

# Результаты должны быть заполнены из callback-функций
foreach ($results as $id => $result)
echo
$id . ": " . $result['handle'] . ", " . $result['data'] . "\n";


function
reverse_complete($task, $results)
{
$results[$task->unique()] = array("handle"=>$task->jobHandle(), "data"=>$task->data());
}

?>

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

t2: H.foo:21, Hello World!
t1: H:foo:22, !dlroW olleH

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

Добавить

Примечания пользователей 3 notes

up
7
liv_romania at yahoo dot com
9 years ago
On PHP 5.5 you can use the following code for passing context by reference and avoid "Call-time pass-by-reference has been removed":

<?php
$client
= new GearmanClient();
$client->addServer();

# Set a function to be called when the work is complete
$client->setCompleteCallback("reverse_complete");

# Use StdClass instead of array
$results = new StdClass();
$results->value = array();

# Add some tasks for a placeholder of where to put the results
$client->addTask("reverse", "Hello World!", $results, "t1");
$client->addTask("reverse", "!dlroW olleH", $results, "t2");

$client->runTasks();

# The results should now be filled in from the callbacks
foreach ($results->value as $id => $result) {
echo
$id . ": " . $result['handle'] . ", " . $result['data'] . "\n";
}

function
reverse_complete(GearmanTask $task, StdClass $results)
{
$results->value[$task->unique()] = array(
"handle" => $task->jobHandle(),
"data" => $task->data()
);
}
?>
up
1
stanislav dot reshetnev at gmail dot com
10 years ago
Note that param $unique must be different for multiple tasks if You want to run they all separately. If param $unique is equal for multiple tasks You will get the same task:

<?php
$unique
=1;

$gclient = GearmanClient();
$gclient->addServer('srv');

$this->setCreatedCallback(function(GearmanTask $task) {
print
$task->jobHandle() . "\n";
});

$gclient->addTask('function_name', 'workload', null, $unique);
$gclient->addTask('function_name', 'workload', null, $unique);
$gclient->addTask('function_name', 'workload', null, $unique);
$gclient->runTasks();

sleep(5);
?>

This sript will print only one handler:

H:srv:377382343
H:srv:377382343
H:srv:377382343
up
0
Jeremy Zerr
11 years ago
As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in $client->addTask(..., ..., &$results, ...);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.

So that means that when you call addTask with a context parameter as in the example above like this:

<?php
# Add some tasks for a placeholder of where to put the results
$results = array();
$client->addTask("reverse", "Hello World!", &$results, "t1");
?>

You get this "call-time pass-by-reference" warning (or error). This can be avoided and still result in functional code by changing the context variable to be an object so that it is passed by reference like this:

<?php
$results
= new \stdClass();
$client->addTask("reverse", "Hello World!", $results, "t1");
?>

Then for completeness, change the complete handler to expect a reference:

<?php
function reverse_complete($task, &$results) { ... }
?>

Then inside the complete handler, you can use the $results object to save your results to be accessible outside the complete handler.
To Top