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