GearmanClient::addTask

(PECL gearman >= 0.5.0)

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

Описание

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

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

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

function_name

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

workload

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

context

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

unique

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

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

Объект GearmanTask или FALSE, если задача не может быть добавлена.

Примеры

Пример #1 Основное представление двух задач

<?php

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

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

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

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

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

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

function 
complete($task

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

?>

Результатом выполнения данного примера будет что-то подобное:

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

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

<?php

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

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

$client->setCompleteCallback("reverse_complete");
$client->runTasks();

# Результаты должны быть заполнены из обратного вызова
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

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

Коментарии

Автор:
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.
2013-11-15 20:14:00
http://php5.kiev.ua/manual/ru/gearmanclient.addtask.html
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
2014-10-31 18:17:09
http://php5.kiev.ua/manual/ru/gearmanclient.addtask.html
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 $taskStdClass $results)
{
   
$results->value[$task->unique()] = array(
       
"handle" => $task->jobHandle(),
       
"data" => $task->data()
    );
}
?>
2015-07-19 15:08:06
http://php5.kiev.ua/manual/ru/gearmanclient.addtask.html

    Поддержать сайт на родительском проекте КГБ