我想在Symfony2中创建一个后台进程,使用Process component并在后台运行它,如下所示:
$process = new Process('php myfile.php --option1 --option2');
$process->start();
我想在这里运行的脚本将无限制地运行(while (true)
或类似的东西)并且应该可以从控制台命令或控制器中终止。
问题是 - 如何从不同于创建的上下文中访问Symfony中的这样一个进程(例如从控制器)?那是 - 没有原始Process
实例?让我们说一个对路由create_process
的请求启动该过程,然后对kill_process
的请求应该杀死它。它甚至可能吗?
我能想到的一种方法是序列化流程对象并存储在数据库中,但似乎这个解决方案可能存在很多问题。
答案 0 :(得分:0)
你不应该这样做。
PHP是无状态,每个请求都是完全唯一的。
我不知道Symfony Processes如何在内部工作,但是AFAIK没有办法杀死通过exec()
,passthru()
等执行的命令。
您可以阅读本节并了解它是否有帮助:http://symfony.com/doc/current/components/process.html#process-pid
如果它还没有,你仍然可以在启动过程时获得当前时间戳(例如1422971460),并定期检查是否存在名为" kill_1422971460"的文件,并且它存在,删除它并结束该过程。
但是我建议你为这种过程使用另一种编程语言,因为PHP不是为此而设计的。此外,您可以在apache和fcgi线程之间点击max_execution_time
或超时,这将最终导致您的进程被终止。它不可靠,它不会很好地为你服务。
答案 1 :(得分:0)
我使用DaemonizableCommandBundle做了类似的事情:
它有一个EndlessCommand
类,您可以扩展并创建一个在循环中执行某些操作的命令,您可以随时终止该类;它确实尝试优雅地终止迭代。