Gearman作业状态存在的问题

问题描述:

我有一个Gearman服务器正在运行一个需要几分钟才能完成的进程。我正在运行一个进度条来显示完成情况,并试图使用Gearman PHP扩展和jobStatus()函数来获取酒吧的百分比。Gearman作业状态存在的问题

该作业绝对是主动的,因为前两个字段(已知的+仍在运行)返回true。然而,第三和第四个字段(完成百分比的分子和分母)没有任何结果。有人知道为什么这可能是或如何计算这些数字?

public bool GearmanJob::sendStatus (int $numerator , int $denominator) 

将状态信息发送给作业 服务器和任何监听的客户。使用 这指定已完成作业的百分比。

为了能够使用它,您可能还需要修改客户端来处理通信。

client.php

<?php 
global $argc,$argv; 

if (!file_exists($argv[1])) { 
     echo "File not found\n"; 
     exit(1); 
} 

$gmclient= new GearmanClient(); 
$gmclient->addServer(); 
do 
{ 
    $result = $gmclient->do("linecount", file_get_contents($argv[1])); 
    # Check for various return packets and errors. 

    switch($gmclient->returnCode()) 
    { 
    case GEARMAN_WORK_STATUS: 
     list($numerator, $denominator)= $gmclient->doStatus(); 
     echo "Status: " . sprintf("%d%%",($numerator/$denominator)*100) 
      . " complete\r"; 
     break; 
    case GEARMAN_SUCCESS: 
     break; 
    } 
} 
while($gmclient->returnCode() != GEARMAN_SUCCESS); 

echo "\nResult: $result\n"; 

worker.php

<?php 
$worker= new GearmanWorker(); 
$worker->addServer(); 
$worker->addFunction("linecount", "linecount"); 
while ($worker->work()); 

    function linecount($job) 
    { 
      $lines = preg_split('/[\r\n]/', 
         $job->workload(),null,PREG_SPLIT_NO_EMPTY); 
      $linecount = count($lines); 
      $n = 0; 
      foreach ($lines as $line) { 
        usleep(3000); 
        $n++; 
        $job->sendStatus($n,$linecount); 
        $ret++; 
      } 
      return $ret; 
    } 
+0

这段代码是否正常工作?我测试它没有任何成功 – slier 2014-11-29 16:33:38

+0

它曾经测试,并在2011年发现与gearmand 0.20一起工作的顺序。现在,gearmand 1.2发布了,这两个版本之间很可能会对API进行更改。 – 2014-12-01 10:09:23

+0

你设法获得客户端的状态吗?我的工作根本没有工作..创业者api几乎没有改变..代码工作就好了..我只是想知道我是否有不适当的安装gearman – slier 2014-12-01 10:51:53

工作人员是否配置为返回状态?

如果您自己编写它们,您必须做一些额外的工作才能让它们返回细节。

+0

啊,感谢这么多,不知道需要配置的工人。您可以指出哪些资源可以准确配置工作人员? – 2011-04-14 17:17:40

+0

你自己写了包吗?当你收到一份工作时,你可以返回状态:http://www.php.net/manual/en/gearmanjob.sendstatus.php – preinheimer 2011-04-14 17:39:42