【问题标题】:Symfony2 - process launching a symfony2 commandSymfony2 - 启动 symfony2 命令的进程
【发布时间】:2014-10-21 13:50:57
【问题描述】:

我的目标是在后台启动一些耗时的功能,以避免用户在呈现服务器响应之前等待。

我有一个 Symfony 项目,我正在从控制器启动一个异步进程。此过程将启动一个 Symfony 命令,该命令将调用另一个控制器。

问题是当我使用start() 调用进程时

$process = new Process('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console scopusftpupload ' . escapeshellcmd($params));
$process->start();

然后这个过程什么也没有发生,但是重定向和我后来的一些其他代码可以工作。

但是,如果我这样做了

$process->run();

然后这个过程工作正常,但我需要等到过程完成才能渲染视图。

知道我做错了什么吗?

【问题讨论】:

    标签: php symfony asynchronous process symfony-process


    【解决方案1】:

    我使用 exec 找到了解决此问题的方法,而不是创建新的 Process 对象。

    exec('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console scopusftpupload ' . escapeshellcmd($params) . ' > /dev/null 2>&1 &');
    

    【讨论】:

      【解决方案2】:

      我们使用 Gearman 作业服务器进行异步处理 - http://gearman.org/

      有一些包可以简化在 Symfony 项目中对 Gearman 的使用。我们使用 mmoreram/GearmanBundle - https://github.com/mmoreram/GearmanBundle。基本上,你创建你的工人,它可以是一个服务,并调用它来完成耗时的任务。我们将它用于需要很长时间的数据导入。

      【讨论】:

      • 谢谢@dmnptr,这可能有效,但对于我需要的用法来说有点复杂。我找到了使用 exec 的解决方法,将发布答案
      • 但是,这值得 +1 :)
      猜你喜欢
      • 2014-07-16
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多