2

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

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

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

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

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

4

2 回答 2

0

你不应该这样做。

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

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

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

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

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

于 2015-02-03T13:53:18.847 回答
0

我使用 DaemonizableCommandBundle 做了类似的事情:

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

于 2015-02-03T13:55:06.557 回答