3

我正在尝试创建一个 cli (symfony/console) 来管理消耗消息队列的长时间运行的子进程 (symfony/process)。我有两个命令,Consume 和 Listen。Consume 是 Listen 的包装器,因此可以在后台运行。Listen 是一个长时间运行的 MQ 转储,它在添加到消息队列时显示附加消息。

问题:当尝试从 Consume 中调用 Listen 的 cli 命令时它启动进程并给我一个 PID,但随后子进程立即死亡。我需要弄清楚如何让 Consume 分拆多个实际保持运行的 Listen 进程。

如果相关,它将运行的操作系统是 SLES 12 和使用 PHP 5.5 的 Ubuntu 14.04。

一些代码(相关片段)


// Runs as: php mycli.php mq:listen
// Keeps running until you ctrl+C
// On the commandline, I can run this as
// nohup php mycli.php mq:listen 2>&1 > /dev/null &
// and it works fine as a long running process.
protected function execute(InputInterface $input, OutputInterface $output)
{
    $mq = new Mq::connect();

    while (true) {
        // read the queue
        $mq->getMessage();
    }
}

消耗

// Runs as: php mycli.php mq:consume --listen
// Goal: Run the mq:listen command in the background
protected function execute(InputInterface $input, OutputInterface $output)
{   
    if ($input->getOption('listen')) {

        $process = new Process('php mycli.php mq:listen');

        $process->start();

        $pid = $process->getPid();
        $output->writeln("Worker started with PID: $pid");

    }
}
4

1 回答 1

2

像这样的任务通常会委托给像主管这样的任务调度程序。像这样将进程作为孤儿离开是非常危险的。如果您的消息队列客户端失去连接但进程仍在运行,它们实际上会变成僵尸。

您需要在mq:consume每个子进程的持续时间内保持命令运行。这是可以实现的,如最后三个示例所示:http ://symfony.com/blog/new-in-symfony-2-2-process-component-enhancements

于 2015-03-13T17:16:41.387 回答