我已经成功配置并使用了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-terminal ,那么我可以看到该过程而不是直接使用 php命令< / em> ,我还添加了 / dev / null ,以便它不再等待响应。然后工人被唤醒并完成工作。
问题:
当此操作执行多次或由不同客户端中的多个用户执行时,我的问题就出现了,因此,正在实例化运行 worker.php 的多个终端。
如何只有一个工作人员?,即使我可以为不同客户端中的多个用户提供多个工作人员,每次任务完成时如何关闭工作人员?< /强>
答案 0 :(得分:1)
您可以尝试添加returnCode()和jobStatus()。
此处的示例 - http://php.net/manual/en/gearmanclient.dobackground.php
答案 1 :(得分:1)
如果您有一个队列系统,那么工作人员应该始终在后台运行并准备好接收新的工作。
我认为队列系统逻辑存在误解。您应该只添加一个将由工作人员处理的新作业,如果您想要完成作业,则不要启动该作业。
Gearman通常与主管合作得很好。主管将控制工人并确保其始终可用。如果您需要同时运行多个作业,则可以随时添加新工作程序。
只需寻找gearman + supervisor + php,有很多文章解释如何设置它。
答案 2 :(得分:0)
让主管负责启动和监控php进程是可行的方法。
这种方法有一些优点:例如,您可以让supervisord自动启动工作人员,甚至是多个实例。如果您希望通过自己的Web界面管理工作人员,您甚至可以通过xmlrpc控制supervisord流程(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