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