我正在尝试创建一个 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");
}
}