访问 Symfony2 中的后台进程


Access a background process in Symfony2

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

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

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

问题是 - 我如何在Symfony中访问这样的进程(例如从控制器)从与创建时不同的上下文?也就是说 - 没有原始Process实例?假设对路由的请求create_process启动了该过程,那么对kill_process的请求应该会终止它。甚至可能吗?

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

我使用DaemonizableCommandBundle做了这样的事情:

  • https://github.com/mac-cain13/daemonizable-command

它有一个EndlessCommand类,您可以扩展和创建一个在循环中执行某些操作的命令,并且可以随时终止该命令;它确实尝试优雅地终止迭代。

你不应该这样做。

PHP 是无状态的,每个请求都是完全唯一的。

我不知道Symfony进程在内部是如何工作的,但是AFAIK没有办法杀死通过exec()passthru()等执行的命令。

您可以阅读本节并了解它是否有帮助:http://symfony.com/doc/current/components/process.html#process-pid

如果没有,您仍然可以在启动进程时获取当前时间戳(例如1422971460),并定期检查是否存在名为"kill_1422971460"的文件,一旦存在,就将其删除并结束进程。

但是我建议您为此类进程使用另一种编程语言,因为PHP不是为此而设计的。您也可以在 apache 和 fcgi 线程之间遇到max_execution_time或超时,这最终会杀死您的进程。它不可靠,也不会很好地为您服务。