0
公共 GearmanTask GearmanClient::addTask ( 字符串 $function_name , 字符串 $workload [, 混合 &$context [, 字符串 $unique ]] )
public bool GearmanWorker::addFunction ( string $function_name , callback $function [, mixed &$context [, int $timeout ]] )

这些是可用于集成两者的类方法。有了这些,您如何将工作负载与调用的函数联系起来?

4

1 回答 1

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循环。确保适当地设置超时和内存限制。
  • 给工人一个运行限制也是一个好习惯。例如,只允许 worker 运行几次,然后exit;PHP 仍然会占用内存,并且很难判断 worker 何时会因为内存不足而被杀死。
  • 同样,最好将工人设计为幂等的,因此如果工人失败,可以将工作重新提交给工人。
  • 客户端可以将作业提交给具有不同优先级的工作人员,并且它们不必像上面的示例那样必须在后台运行。它们可以运行以使客户端阻塞。
于 2011-06-14T03:35:06.113 回答