从 symfony/console 开始背景 symfony/process

Start a background symfony/process from symfony/console

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

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

的多个 Listen 进程

如果相关,运行 上的 OS(es) 是 SLES 12 和 Ubuntu 14.04 使用 PHP 5.5.

一些代码(相关片段)


// 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");

    }
}

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

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