我使用的代码与http://php.net/manual/en/gearmanclient.donormal.php
中的示例#2完全相同我得到了预期的工人输出,如手册
问题是,我的客户端没有产生预期的输出,如手册
预期的客户输出是:
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
相反,这就是我所得到的:
Sending job
Success: Hello!!olleH
据我所知,工作人员按预期工作,它确实将数据发送回客户端,这就是为什么我得到Sucess: Hello!!olleH
而不仅仅是!olleH
,我想知道为什么轮询状态不起作用
经过一些调试后,我发现do..while
块仅运行一次
$gmclient->returnCode()
返回0
看起来我的客户端没有收到工作人员的任何状态
有些信息:
os:ubuntu 14.04(vagrant)
gearmand版本:1.1.12
扩展版:1.1.2
libgearman版本:1.1.12
我是齿轮手的新手,我想要实现的是与手册中相同的客户端输出,非常感谢任何帮助
答案 0 :(得分:1)
我的猜测是文档过时或错误。我做了一点挖掘,在0.21中对Gearman :: do()函数进行了更改,使其运行直到完成或错误。请参阅http://gearman.info/libgearman/gearman_client_do.html。
在版本0.21中更改:将不再返回GEARMAN_PAUSE。 do操作现在将运行直到完成或错误。
相反,我认为最好用任务和一些回调来做你想要的事情:
<?php
# Client code
# Create our client object.
$gmclient= new GearmanClient();
# Add default server (localhost).
$gmclient->addServer();
echo "Sending job\n";
# Send reverse job
$gmclient->setCompleteCallback('gm_complete');
$gmclient->setDataCallback('gm_data');
$gmclient->setStatusCallback('gm_status');
$gmclient->addTask("reverse", "Hello!");
$gmclient->runTasks();
function gm_data(GearmanTask $task) {
echo "Data: {$task->data()}".PHP_EOL;
}
function gm_complete(GearmanTask $task) {
echo "Success: {$task->data()}".PHP_EOL;
}
function gm_status(GearmanTask $task) {
echo "Status: {$task->taskNumerator()} / {$task->taskDenominator()}".PHP_EOL;
}
?>