Я хотел бы создать фоновый процесс в Symfony2, используя Компонент процесса и запустите его в фоновом режиме, вот так:
$process = new Process('php myfile.php --option1 --option2');
$process->start();
Скрипт, который я хочу запустить, будет работать бесконечно (while (true)
или что-то подобное) и должно быть возможно убить из консоли или команды.
Вопрос в том, как мне получить доступ к такому процессу в Symfony (например, из контроллера) из другого контекста, чем он был создан? То есть — без оригинала Process
пример? Допустим, запрос к маршруту create_process
запускает процесс, затем запрос kill_process
должен убить это. Это вообще возможно?
Один из способов, который я могу придумать, — это сериализация объекта процесса и его сохранение в базе данных, но, похоже, с этим решением может возникнуть много проблем.
Я сделал что-то вроде этого, используя DaemonizableCommandBundle:
Оно имеет EndlessCommand
класс, который вы можете расширить и создать команду, которая делает что-то в цикле и которую вы можете завершить в любое время; он пытается завершить итерацию изящно.
Ты не должен этого делать.
PHP это без гражданства, каждый запрос абсолютно уникален.
Я не знаю, как процессы Symfony работают внутри, но AFAIK нет способа убить команды, выполняемые через exec()
,passthru()
или т.п.
Вы можете прочитать этот раздел и узнать, поможет ли это: http://symfony.com/doc/current/components/process.html#process-pid
Если это не так, вы все равно можете получить текущую временную метку (например, 1422971460) при запуске процесса и периодически проверять наличие файла с именем kill_1422971460, и, как только он существует, удалить его и завершить процесс.
Но я бы посоветовал вам использовать другой язык программирования для такого рода процессов, так как PHP не предназначен для этого. Также вы можете нажать max_execution_time
или тайм-ауты между потоками apache и fcgi, которые приведут к уничтожению вашего процесса. Это ненадежно и не будет служить вам хорошо.