【问题标题】:Start and stopping workers in gearman php在 gearman php 中启动和停止工作人员
【发布时间】:2014-10-28 08:53:04
【问题描述】:

我已经成功配置并使用了 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 命令,我还添加了 /dev/null 以便它不再等待响应。然后工人被唤醒并运行工作。

问题:

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

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

【问题讨论】:

    标签: php yii backgroundworker worker gearman


    【解决方案1】:

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

    这里有一个示例 - http://php.net/manual/en/gearmanclient.dobackground.php

    【讨论】:

      【解决方案2】:

      如果您有一个队列系统,工作人员应该始终在后台运行并准备好迎接新的工作。

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

      Gearman 通常与主管相处得很好。主管将控制工人并确保它始终可用。如果您需要同时运行多个作业,那么您可以随时添加一个新的工作人员。

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

      【讨论】:

        【解决方案3】:

        让 supervisord 负责 php 进程的启动和监控是可行的方法。

        这种方法有几个优点:例如,您可以让 supervisord 自动启动工作程序,甚至是它的多个实例。你甚至可以通过 xmlrpc 控制 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-08
          • 1970-01-01
          • 1970-01-01
          • 2013-02-05
          • 2010-12-16
          • 2021-11-02
          相关资源
          最近更新 更多