Dutch PHP Conference 2021 - Call for Papers

GearmanClient::addTask

(PECL gearman >= 0.5.0)

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

Описание

public GearmanClient::addTask ( string $function_name , string $workload , mixed &$context = ? , string $unique = ? ) : GearmanTask

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

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

function_name

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

workload

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

context

Контекст приложения, связываемый с задачей

unique

Уникальный 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

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

add a note add a note

User Contributed Notes 3 notes

up
8
liv_romania at yahoo dot com
5 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
0
stanislav dot reshetnev at gmail dot com
6 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
7 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