你如何将GearmanJob与GearmanWorker和GearmanClient联系起来?

时间:2011-06-14 02:48:08

标签: gearman

public GearmanTask GearmanClient::addTask  ( string $function_name  , string $workload  [, mixed &$context  [, string $unique  ]] )
public bool GearmanWorker::addFunction  ( string $function_name  , callback $function  [, mixed &$context  [, int $timeout  ]] )

这些类方法可用于集成两者。 有了这些,你如何将工作量与被调用函数联系起来?

1 个答案:

答案 0 :(得分:1)

GearmanClient用于提交任务。通常,这是通过网页或用于阅读要提交的任务列表的脚本来完成的。

GearmanWorker意味着以这样一种方式建立,即许多并行的“工人”可以同时运行。从逻辑上讲,无论工人做什么都应该代表一个原子工作单元。这可能意味着将对象转换为另一个并将其保存回数据库,或者为单个用户组装和发送html电子邮件。 $function_name是一个带有单个参数的函数,它是一个GearmanJob对象。

因此,您的控制器脚本可能看起来像这样。

  $gearman_params = json_encode( array(
      'id'       => 77,
      'options'  => array('push' => true),
  ) );
  $client = new GearmanClient();
  $client->doBackground( "widgetize", $gearman_params );

然后,你的工作人员会做这样的事情。

$gmworker  = GearmanWorker;
$gmworker->addFunction( "widgetize", "widgetize" );
while( $gmworker->work() ) {  

if ( $gmworker->returnCode() !== GEARMAN_SUCCESS ) {
    echo "Worker Terminated." . PHP_EOL ;
    break;
  }

} // while *working*

function widgetize( $job ) {
    $workload = json_decode( $job->workload() );

    /* do stuff */
}

要记住的一些事项:

  • 工作脚本设计为长时间运行的脚本,因此while循环。确保正确设置超时和内存限制。
  • 给予工人运行限制也是一种好习惯。就像在,只允许工作者运行几次,然后exit; PHP仍然很糟糕的内存使用,并且很难判断一个工作人员会因为内存不足而被杀死。
  • 同样,最好将工人设计为幂等人,因此如果工作失败,就可以将工作重新提交给工人。
  • 客户可以向具有不同优先级的工作人员提交工作,并且它们不一定必须在后台运行,如上例所示。它们可以运行,以便客户端阻止。