我想在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
或超时,这最终会杀死您的进程。它不可靠,也不会很好地为您服务。