访问Symfony2中的后台进程

时间:2015-02-03 13:15:51

标签: php symfony process symfony-process

我想在Symfony2中创建一个后台进程,使用Process component并在后台运行它,如下所示:

$process = new Process('php myfile.php --option1 --option2');
$process->start();

我想在这里运行的脚本将无限制地运行(while (true)或类似的东西)并且应该可以从控制台命令或控制器中终止。

问题是 - 如何从不同于创建的上下文中访问Symfony中的这样一个进程(例如从控制器)?那是 - 没有原始Process实例?让我们说一个对路由create_process的请求启动该过程,然后对kill_process的请求应该杀死它。它甚至可能吗?

我能想到的一种方法是序列化流程对象并存储在数据库中,但似乎这个解决方案可能存在很多问题。

2 个答案:

答案 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类,您可以扩展并创建一个在循环中执行某些操作的命令,您可以随时终止该类;它确实尝试优雅地终止迭代。