首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GearmanClient::addTaskBackground

(PECL gearman >= 0.5.0)

GearmanClient :: addTaskBackground - 添加一个后台任务并行运行

描述

代码语言:javascript
复制
public GearmanTask GearmanClient::addTaskBackground ( string $function_name , string $workload [, mixed &$context [, string $unique ]] )

添加要与其他任务并行运行的后台任务。为所有要并行运行的任务调用此方法,然后调用GearmanClient :: runTasks()来执行该工作。

参数

function_name

工作人员执行的注册功能

workload

要处理的序列化数据

context

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

unique

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

返回值

GearmanTask对象或FALSE无法添加任务。

例子

例#1两个任务,一个背景,一个不是

这个例子说明了运行一个后台任务和一个普通任务的区别。客户端添加两个任务来执行相同的功能,但添加了addTaskBackground()。回调被设置为可以追踪作业的进度。一个简单的人工延迟报告工作进度,客户通过回调选择。这个例子运行两名工人。请注意后台任务不显示在客户端输出中。

代码语言:javascript
复制
<?php

#?The?client?script

#?create?our?gearman?client
$gmc=?new?GearmanClient();

#?add?the?default?job?server
$gmc->addServer();

#?set?a?couple?of?callbacks?so?we?can?track?progress
$gmc->setCompleteCallback("reverse_complete");
$gmc->setStatusCallback("reverse_status");

#?add?a?task?for?the?"reverse"?function
$task=?$gmc->addTask("reverse",?"Hello?World!",?null,?"1");

#?add?another?task,?but?this?one?to?run?in?the?background
$task=?$gmc->addTaskBackground("reverse",?"!dlroW?olleH",?null,?"2");

if?(!?$gmc->runTasks())
{
????echo?"ERROR?"?.?$gmc->error()?.?"\n";
????exit;
}

echo?"DONE\n";

function?reverse_status($task)
{
????echo?"STATUS:?"?.?$task->unique()?.?",?"?.?$task->jobHandle()?.?"?-?"?.?$task->taskNumerator()?.?
?????????"/"?.?$task->taskDenominator()?.?"\n";
}

function?reverse_complete($task)
{
????echo?"COMPLETE:?"?.?$task->unique()?.?",?"?.?$task->data()?.?"\n";
}

?>
代码语言:javascript
复制
<?php

#?The?worker?script

echo?"Starting\n";

#?Create?our?worker?object.
$gmworker=?new?GearmanWorker();

#?Add?default?server?(localhost).
$gmworker->addServer();

#?Register?function?"reverse"?with?the?server.
$gmworker->addFunction("reverse",?"reverse_fn");

print?"Waiting?for?job...\n";
while($gmworker->work())
{
??if?($gmworker->returnCode()?!=?GEARMAN_SUCCESS)
??{
????echo?"return_code:?"?.?$gmworker->returnCode()?.?"\n";
????break;
??}
}

function?reverse_fn($job)
{
??echo?"Received?job:?"?.?$job->handle()?.?"\n";

??$workload?=?$job->workload();
??$workload_size?=?$job->workloadSize();

??echo?"Workload:?$workload?($workload_size)\n";

??#?This?status?loop?is?not?needed,?just?showing?how?it?works
??for?($x=?0;?$x?<?$workload_size;?$x++)
??{
????echo?"Sending?status:?"?.?($x?+?1)?.?"/$workload_size?complete\n";
????$job->sendStatus($x+1,?$workload_size);
????$job->sendData(substr($workload,?$x,?1));
????sleep(1);
??}

??$result=?strrev($workload);
??echo?"Result:?$result\n";

??#?Return?what?we?want?to?send?back?to?the?client.
??return?$result;
}

?>

两名工人的工作量输出:

代码语言:javascript
复制
Received job: H:foo.local:65
Workload: !dlroW olleH (12)
1/12 complete
Received job: H:foo.local:66
Workload: Hello World! (12)
Sending status: 1/12 complete
Sending status: 2/12 complete
Sending status: 2/12 complete
Sending status: 3/12 complete
Sending status: 3/12 complete
Sending status: 4/12 complete
Sending status: 4/12 complete
Sending status: 5/12 complete
Sending status: 5/12 complete
Sending status: 6/12 complete
Sending status: 6/12 complete
Sending status: 7/12 complete
Sending status: 7/12 complete
Sending status: 8/12 complete
Sending status: 8/12 complete
Sending status: 9/12 complete
Sending status: 9/12 complete
Sending status: 10/12 complete
Sending status: 10/12 complete
Sending status: 11/12 complete
Sending status: 11/12 complete
Sending status: 12/12 complete
Sending status: 12/12 complete
Result: !dlroW olleH
Result: Hello World!

客户端输出:

代码语言:javascript
复制
STATUS: 1, H:foo.local:66 - 1/12
STATUS: 1, H:foo.local:66 - 2/12
STATUS: 1, H:foo.local:66 - 3/12
STATUS: 1, H:foo.local:66 - 4/12
STATUS: 1, H:foo.local:66 - 5/12
STATUS: 1, H:foo.local:66 - 6/12
STATUS: 1, H:foo.local:66 - 7/12
STATUS: 1, H:foo.local:66 - 8/12
STATUS: 1, H:foo.local:66 - 9/12
STATUS: 1, H:foo.local:66 - 10/12
STATUS: 1, H:foo.local:66 - 11/12
STATUS: 1, H:foo.local:66 - 12/12
COMPLETE: 1, !dlroW olleH
DONE

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com