在gearman php中启动和停止工人

在gearman php中启动和停止工人,php,yii,backgroundworker,worker,gearman,Php,Yii,Backgroundworker,Worker,Gearman,我已经成功地配置并使用了gearman及其pecl php扩展。我用它在后台执行一个关于长sql查询的长过程。顺便说一句,如果细节有帮助的话,我正在使用Yii 以下是我如何使用它: public function actionProcessWithGearman(){ $output = shell_exec('gnome-terminal -e "php workers/worker.php" > /dev/null 2>/dev/null &'); $client

我已经成功地配置并使用了gearman及其pecl php扩展。我用它在后台执行一个关于长sql查询的长过程。顺便说一句,如果细节有帮助的话,我正在使用Yii

以下是我如何使用它:

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终端,这样我就可以看到这个过程,而不是直接使用php命令,我还添加了/dev/null,这样它就不会再等待响应了。然后工人被叫醒,开始工作

问题:

当此操作执行多次或由不同客户机中的多个用户执行时,就会出现我的问题,结果是运行worker.php的多个终端被实例化


如何只有一个worker?即使我可以为不同客户端中的多个用户使用多个worker,如何在每次任务完成时关闭一个worker?

您可以尝试添加returnCode()和jobStatus()


这里有一个示例-

如果您有一个队列系统,那么工作人员应该始终在后台运行,并随时准备捕捉新的作业

我认为对排队系统的逻辑存在误解。您应该只添加一个将由工作人员处理的新作业,如果希望完成某项作业,则不应启动该工作人员

Gearman通常和主管相处得很好。主管将控制工人并确保其始终可用。如果需要同时运行多个作业,则始终可以添加一个新的辅助工


只要看看gearman+supervisor+php,就会发现有很多文章解释了如何设置它。

让supervisor负责php进程的启动和监控是一条可行之路

这种方法有几个优点:例如,您可以让supervisord自动启动Worker,甚至可以启动它的多个实例。如果您希望从自己的web界面管理工作人员,甚至可以通过xmlrpc控制supervisord进程()

样本管理器配置

[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