2010-12-21 97 views
5

在單獨的進程中運行Symfony任務的正確方法是什麼?我的第一個猜測是使用fork/exec,但根據this,你不能用任何保持打開的文件描述符或連接(如MySQL)的東西來做。所以這聽起來不像是一種選擇。另一種選擇是做exec('symfony taskname &'),但這似乎是一個黑客攻擊。這是我能做的最好的嗎?有第三種方法嗎?如何在操作的背景中正確運行Symfony任務?

+0

pcntl_fork函數只適用於cgi版本的php。如果你通過apache運行php,這是不行的。使用exec幾乎是使用apache完成它的唯一方法,但它絕對是醜陋的,並且必須靜靜地運行以便同時執行。 – Jestep 2010-12-22 14:45:39

+0

我花了很長時間才發現你必須將stdout重定向到一個文件才能真正運行。那是你「靜靜地運行」的意思嗎? – 2010-12-23 19:50:24

回答

3

以下是我最後做它:

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

你必須將stdout,否則它不會在後臺運行(儘管你不必使用/ dev/null的,如果你想要實際的輸出)。在我的情況下,我將所有的任務設置爲使用Symfony的文件記錄器,所以這不是問題。

我仍然在尋找更好的解決方案。這看起來像一個黑客。

-8

Php不知道多線程。
是的,這是PHP IMO的一個很大的缺陷。
有一種方法可以執行多線程,但不推薦使用。它很複雜,而且它很難看,它不問問題。

所以,我認爲你能做的最好的事情就像是exec,或者像打電話一樣的web服務的maby somthing?

4

通常處理的方式是使用任務隊列。當你想做一個後臺進程時,將它添加到某種類型的隊列中(你可以使用你的數據庫,或者你可以使用像beanstalkd這樣的實際隊列守護進程)。然後你有一些守護程序,它們的工作是將工作從隊列中拉出來並執行。