3

メッセージキューを消費する長時間実行される子プロセス (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");

    }
}
4

1 に答える 1

2

このようなタスクは、通常、Supervisor などのタスク スケジューラに委任されます。このようにプロセスを孤児のままにしておくのは非常に危険です。メッセージ キュー クライアントが接続を失ってもプロセスがまだ実行されている場合、プロセスは事実上ゾンビになります。

mq:consume各サブプロセスの期間中、コマンドを実行し続ける必要があります。これは、 http ://symfony.com/blog/new-in-symfony-2-2-process-component-enhancements の最後の 3 つの例で示されているように実現可能です。

于 2015-03-13T17:16:41.387 に答える