Symfomaniacs!
Допустим, у меня есть этот код в моем контроллере:
for ($i = 0; $i <= 3; $i++)
{
$command = 'php ' . $kernel->getRootDir() . '/console Educa:ExecuteJob '
. $i . ' --env=' . $kernel->getEnvironment();
$logger->addInfo("Executing command: ".$command);
$process = new Process($command);
$process->disableOutput();
$process->start();
}
//sleep(5);
return $this->render(...);
а выполнение ExecuteJob занимает около 5 секунд. Внутри консольной команды у меня есть logger-> addInfo () как в начале, так и в конце скрипта.
Если я раскомментирую спать (5) линии они оба печатают. Если нет, в журнале печатается только начальная строка, что должно означать, что когда скрипты контроллера заканчиваются, он останавливает все процессы, я ошибся?
Есть ли способ обойти это? Я открыт, чтобы изменить дизайн, я просто хочу выполнить фоновую работу, не дожидаясь отображения страницы (даже не актуально для этой страницы)
PS: я ищу способ запуска фоновых задач, которые играет хорошо с Symfony2, а не странные php хаки или же рабочие места cron. Я знаю о них. Я тоже не хочу настраивать MQ очередь. Это отчасти излишне из-за того, что я пытаюсь.
В вашей ситуации идеальным решением будет использование Событие kernel.terminate, он срабатывает после того, как ответ передается клиенту, поэтому вы можете выполнять там тяжелые операции.
Вам нужно что-то вроде этого https://github.com/schmittjoh/JMSJobQueueBundle но вам нужно будет настроить cron тоже
использование &
в команду, чтобы отправить его в фоновом режиме, как это
$command = 'php ' . $kernel->getRootDir() . '/console Educa:ExecuteJob &'