Я пытаюсь создать cli (symfony / console), который управляет долгосрочными дочерними процессами (symfony / process), которые используют очередь сообщений. У меня есть две команды: потреблять и слушать. Consume — это оболочка для Listen, поэтому его можно запускать в фоновом режиме. Прослушивание — это длительный дамп MQ, который показывает дополнительные сообщения по мере их добавления в очередь сообщений.
проблема: При попытке вызвать команду cli для Listen from в Потребляется, он запускает процесс и дает мне PID, но потом дочерний процесс немедленно умирает. Мне нужно выяснить, как заставить Consume запускать несколько процессов Listen, которые на самом деле продолжают работать.
Если это уместно, то ОС, на которых он будет работать, это 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
Других решений пока нет …