メッセージキューを消費する長時間実行される子プロセス (symfony/process) を管理する cli (symfony/console) を作成しようとしています。Consume と Listen という 2 つのコマンドがあります。Consume は Listen のラッパーなので、バックグラウンドで実行できます。Listen は、MQ の長期実行ダンプであり、メッセージ キューに追加された追加メッセージを示します。
問題: Consume内から Listen の cli コマンドを呼び出そうとすると、プロセスが開始されて PID が返されますが、子プロセスがすぐに終了します。実際に実行を続ける複数の Listen プロセスを Consume にスピンオフさせる方法を理解する必要があります。
関連する場合、これが実行される OS は、PHP 5.5 を使用する SLES 12 および 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");
}
}