2014-10-28 47 views
0

我已成功配置和使用齿轮工及其pecl php扩展。我使用它来执行一个关于后台长sql查询的长进程。我使用Yii btw,如果这个细节有帮助。启动和停止齿轮工人php

下面是我如何使用它:

public function actionProcessWithGearman(){ 

$output = shell_exec('gnome-terminal -e "php workers/worker.php" > /dev/null 2>/dev/null &'); 


$client = new GearmanClient(); 
$client->addServer(); 
$result = $client->doBackground('executeJob',//parameters); 

} 

一些细节:

如果您发现我跑的gnome-terminal第一,这样我可以看到进程,而不是直接与php命令,我也加了/dev/null,以便它不再等待回应。然后工人醒来并开始工作。

问题:

当这个动作多次执行或在不同的客户端由多个用户执行,因此,多个终端运行worker.php被实例化,我的问题就出现了。

我如何让只有一名工人?,即使我可以在几个不同的客户端有几个用户,每次完成任务时我该如何关闭一个工人?

回答

1

如果你在的地方有一个排队系统的工作者应始终在后台运行,并随时准备捕捉新的就业机会。

我认为在队列系统逻辑上存在误解。你只需要添加一个新的工作,由工作人员处理,如果你想完成一项工作,不要启动工作人员。

Gearman通常和主管一起工作顺利。主管将控制工人并确保它始终可用。如果您需要同时运行多个作业,则始终可以添加新的工作人员。

只要寻找gearman + supervisor + php有很多文章解释如何设置。

0

让supervisord照顾php进程的启动和监控是一种方式。

这种方法有几个优点:例如,您可以让supervisord自动启动工作人员,甚至是多个实例。你甚至可以通过XML-RPC控制supervisord过程,如果你喜欢从自己的Web界面来管理你的员工(http://supervisord.org/api.html

样品supervisord的conf

[program:worker_development] 
process_name=worker_%(process_num)s 
command=php worker.php 
directory=/var/ww/myproject 
autorestart=true 
user=ubuntu 
redirect_stderr=false 
numprocs=2 
startretries=5