如何在动作的后台正确运行Symfony任务?

时间:2010-12-21 15:27:02

标签: php symfony1 exec fork

在单独的进程中运行Symfony任务的正确方法是什么。我的第一个猜测是使用fork / exec,但是根据this,你不能用任何保持打开文件描述符或连接的东西(比如MySQL)。所以这听起来不像是一个选择。另一个选择是exec('symfony taskname &'),但这似乎是一个黑客。这是我能做的最好的吗?还有第三种方式吗?

3 个答案:

答案 0 :(得分:4)

通常处理此方法的方法是使用任务队列。当您想要执行后台进程时,将其添加到某种队列中(您可以使用您的数据库,或者您可以使用像beanstalkd这样的实际队列守护进程)。然后你有一些守护进程,其工作是将工作从队列中拉出来并执行它。

答案 1 :(得分:3)

以下是我最终如何做到这一点:

exec('nohup ' . sfConfig::get('sf_root_dir') . '/symfony TASKNAME >/dev/null &');

你必须重定向STDOUT,否则它不会在后台运行(如果你想要实际的输出,你不必使用/ dev / null)。在我的情况下,我将我的所有任务设置为使用Symfony的文件记录器,所以这不是问题。

我仍在寻找更好的解决方案。这看起来像个黑客。

答案 2 :(得分:-8)

Php不知道多线程 是的,这是php IMO的一大缺陷 有一种方法可以进行多线程处理,但不建议这样做。它很复杂,而且很难看,它不是在问,不是在呼唤问题。

所以,我认为你能做的最好的事情就像exec,或maby之类的东西就像调用像服务这样的网络服务?