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 何时会因为内存不足而被杀死。
- 同样,最好将工人设计为幂等的,因此如果工人失败,可以将工作重新提交给工人。
- 客户端可以将作业提交给具有不同优先级的工作人员,并且它们不必像上面的示例那样必须在后台运行。它们可以运行以使客户端阻塞。