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 ]] )
这些类方法可用于集成两者。 有了这些,你如何将工作量与被调用函数联系起来?
答案 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仍然很糟糕的内存使用,并且很难判断一个工作人员会因为内存不足而被杀死。