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

GearmanClient::do

(PECL gearman >= 0.5.0)

GearmanClient :: do - 运行单个任务并返回不赞成使用的结果

描述

代码语言:javascript
复制
public string GearmanClient::do ( string $function_name , string $workload [, string $unique ] )

pecl / gearman 1.0.0开始,不推荐使用GearmanClient :: do()方法。使用GearmanClient :: doNormal()。

参数

function_name

工作人员执行的注册功能

workload

要处理的序列化数据

unique

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

返回值

表示运行任务结果的字符串。

例子

示例#1简单的作业提交并立即返回

代码语言:javascript
复制
<?php

#?Client?code

echo?"Starting\n";

#?Create?our?client?object.
$gmclient=?new?GearmanClient();

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

echo?"Sending?job\n";

$result?=?$gmclient->doNormal("reverse",?"Hello!");

echo?"Success:?$result\n";

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

echo?"Starting\n";

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

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

#?Register?function?"reverse"?with?the?server.?Change?the?worker?function?to
#?"reverse_fn_fast"?for?a?faster?worker?with?no?output.
$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)
{
??return?strrev($job->workload());
}

?>

上面的例子会输出类似于:

代码语言:javascript
复制
Starting
Sending job
Success: !olleH

示例#2提交作业并检索增量状态

提交作业并且脚本循环以检索状态信息。工作人员有一个人工延迟,导致长时间运行的作业,并在处理发生时发送状态和数据。随后每次调用GearmanClient :: do()都会生成正在运行的作业的状态信息。

代码语言:javascript
复制
<?php

#?Client?code

#?Create?our?client?object.
$gmclient=?new?GearmanClient();

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

echo?"Sending?job\n";

#?Send?reverse?job
do
{
??$result?=?$gmclient->doNormal("reverse",?"Hello!");
??#?Check?for?various?return?packets?and?errors.

??switch($gmclient->returnCode())
??{
????case?GEARMAN_WORK_DATA:
??????echo?"Data:?$result\n";
??????break;
????case?GEARMAN_WORK_STATUS:
??????list($numerator,?$denominator)=?$gmclient->doStatus();
??????echo?"Status:?$numerator/$denominator?complete\n";
??????break;
????case?GEARMAN_WORK_FAIL:
??????echo?"Failed\n";
??????exit;
????case?GEARMAN_SUCCESS:
??????break;
????default:
??????echo?"RET:?"?.?$gmclient->returnCode()?.?"\n";
??????echo?"Error:?"?.?$gmclient->error()?.?"\n";
??????echo?"Errno:?"?.?$gmclient->getErrno()?.?"\n";
??????exit;
??}
}
while($gmclient->returnCode()?!=?GEARMAN_SUCCESS);

echo?"Success:?$result\n";

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

#?Worker?code

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
复制
Starting
Waiting for job...
Received job: H:foo.local:106
Workload: Hello! (6)
1/6 complete
2/6 complete
3/6 complete
4/6 complete
5/6 complete
6/6 complete
Result: !olleH

客户端输出:

代码语言:javascript
复制
Starting
Sending job
Status: 1/6 complete
Data: H
Status: 2/6 complete
Data: e
Status: 3/6 complete
Data: l
Status: 4/6 complete
Data: l
Status: 5/6 complete
Data: o
Status: 6/6 complete
Data: !
Success: !olleH

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com