【问题标题】:Access a background process in Symfony2在 Symfony2 中访问后台进程
【发布时间】:2015-02-03 13:15:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php symfony process symfony-process


    【解决方案1】:

    我已经使用 DaemonizableCommandBundle 完成了类似的操作:

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

    【讨论】:

      【解决方案2】:

      你不应该这样做。

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

      我不知道 Symfony 进程在内部是如何工作的,但 AFAIK 无法杀死通过 exec()passthru() 或类似方式执行的命令。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-12
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多