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() 来执行工作。注意,需要有足够的 worker 可用才能使所有任务并行运行。

参数

function_name

worker 要执行的已注册函数

workload

要处理的序列化数据

context

与任务关联的应用程序上下文

unique_key

用于标识特定任务的唯一 ID

返回值

一个 GearmanTask 对象,如果无法添加任务,则为 false

示例

示例 #1 两个任务的基本提交

<?php

# 创建我们的 gearman 客户端
$gmclient= new GearmanClient();

# 添加默认作业服务器
$gmclient->addServer();

# 设置一个函数,在工作完成后调用
$gmclient->setCompleteCallback("complete");

# 添加一个任务,对字符串 "Hello World!" 执行 "reverse" 函数
$gmclient->addTask("reverse", "Hello World!", null, "1");

# 添加另一个任务,对字符串 "!dlroW olleH" 执行 "reverse" 函数
$gmclient->addTask("reverse", "!dlroW olleH", null, "2");

# 运行任务
$gmclient->runTasks();

function
complete($task)
{
print
"COMPLETE: " . $task->unique() . ", " . $task->data() . "\n";
}

?>

上面的示例将输出类似以下内容

COMPLETE: 2, Hello World!
COMPLETE: 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();

# 结果现在应该从回调中填充
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

7
liv_romania at yahoo dot com
9 年前
在 PHP 5.5 上,您可以使用以下代码通过引用传递上下文,并避免 "Call-time pass-by-reference has been removed"

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

# 设置一个函数,在工作完成后被调用
$client->setCompleteCallback("reverse_complete");

# 使用 StdClass 代替数组
$results = new StdClass();
$results->value = array();

# 添加一些任务作为占位符,用于放置结果
$client->addTask("reverse", "Hello World!", $results, "t1");
$client->addTask("reverse", "!dlroW olleH", $results, "t2");

$client->runTasks();

# 现在结果应该通过回调填充
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()
);
}
?>
1
stanislav dot reshetnev at gmail dot com
9 年前
请注意,如果您想分别运行多个任务,参数 $unique 必须对每个任务都不同。如果参数 $unique 对多个任务相同,您将获得相同的任务。

<?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);
?>

这段脚本将只打印一个句柄

H:srv:377382343
H:srv:377382343
H:srv:377382343
0
Jeremy Zerr
10 年前
从 PHP 5.3.0 开始,当您在 $client->addTask(..., ..., &$results, ...); 中使用 & 时,您将收到一个警告,提示“调用时按引用传递”已弃用。从 PHP 5.4.0 开始,调用时按引用传递被移除,所以使用它将引发致命错误。

这意味着,当您像上面的例子那样使用上下文参数调用 addTask 时

<?php
# 添加一些任务作为占位符,用于放置结果
$results = array();
$client->addTask("reverse", "Hello World!", &$results, "t1");
?>

您将收到此“调用时按引用传递”警告(或错误)。这可以通过将上下文变量更改为对象来避免,这样它就会像这样按引用传递

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

为了完整起见,请将完成处理程序更改为期望引用

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

然后在完成处理程序中,您可以使用 $results 对象来保存您的结果,以便在完成处理程序之外访问。
To Top