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


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

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

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的内存使用率仍然很差,而且很难判断工作程序何时会因为内存不足而被杀死
  • 同样,最好将工人设计为幂等的,这样,如果工作失败,就可以重新提交给工人
  • 客户端可以向具有不同优先级的工作者提交作业,并且它们不必像上面的示例那样在后台运行。它们可以运行,以便客户端阻塞

相关内容

  • 没有找到相关文章

最新更新