GearmanClient::addTask
(PECL gearman >= 0.5.0)
GearmanClient::addTask — Добавить задачу, которая будет выполнена в параллельном режиме
Описание
$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
Смотрите также
- GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
- GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
- GearmanClient::addTaskBackground() - Добавить фоновую задачу для работы в параллельном режиме
- GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
- GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
- GearmanClient::runTasks() - Запустить список задач в параллельном режиме
- Функция GearmanClient::addOptions() - Добавить клиентские опции
- Функция GearmanClient::addServer() - Добавить сервер задач для клиента
- Функция GearmanClient::addServers() - Добавить список серверов задач для клиента
- Функция GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
- Функция GearmanClient::addTaskBackground() - Добавить фоновую задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskStatus() - Добавить задачу для получения статуса
- Функция GearmanClient::clearCallbacks() - Очистить все функции обратного вызова данной задачи
- Функция GearmanClient::clone() - Создать копию объекта GearmanClient
- Функция GearmanClient::__construct() - Создать экземпляр GearmanClient
- Функция GearmanClient::context() - Возвращает контекст приложения
- Функция GearmanClient::data() - Возвращает данные приложения (функция устарела)
- Функция GearmanClient::do() - Выполняет одну задачу и возвращает результат [Устаревший метод]
- Функция GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
- Функция GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
- Функция GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
- Функция GearmanClient::doJobHandle() - Получить дескриптор выполняющейся задачи
- Функция GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
- Функция GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме
- Функция GearmanClient::doNormal() - Выполняет одиночное задание и возвращает результат
- Функция GearmanClient::doStatus() - Получение статуса обработки задания
- Функция GearmanClient::echo() - Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]
- Функция GearmanClient::error() - Вернуть строку ошибки для последней встретившейся ошибки
- Функция GearmanClient::getErrno() - Получить значение errno
- Функция GearmanClient::jobStatus() - Получение статуса выполнения фонового задания
- Функция GearmanClient::ping() - Отправляет данные на все сервера и смотрит, какие из них выведут эти данные
- Функция GearmanClient::removeOptions() - Удалить клиентские опции
- Функция GearmanClient::returnCode() - Получить последний возвращённый код Gearman
- Функция GearmanClient::runTasks() - Запустить список задач в параллельном режиме
- Функция GearmanClient::setClientCallback() - Установить функцию обратного вызова, когда есть пакет данных для задачи (устаревший метод)
- Функция GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
- Функция GearmanClient::setContext() - Установить данные приложения
- Функция GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
- Функция GearmanClient::setData() - Установить данные приложения (устаревший метод)
- Функция GearmanClient::setDataCallback() - Задает callback-функцию для обработки переданных данных
- GearmanClient::setExceptionCallback
- GearmanClient::setFailCallback
- Функция GearmanClient::setOptions() - Задание настроек клиента
- Функция GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
- Функция GearmanClient::setTimeout() - Установка таймаута для операций ввода/вывода
- Функция GearmanClient::setWarningCallback() - Задание callback-функции, обслуживающей предупреждения обработчика заданий
- GearmanClient::setWorkloadCallback
- Функция GearmanClient::timeout() - Получение значения таймаута операций ввода/вывода
Коментарии
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.
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
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()
);
}
?>