2012-05-30 201 views
0

過去,我將每個腳本作爲一個單獨的cron作業運行。現在我想用一個cron作業來運行控制器腳本,然後分別調用這些腳本(並行地同時執行),所以我不必每次添加新的cron作業另一個腳本。並行運行Cron作業(PHP)

我擡頭看看pcntl_fork()但我們沒有安裝。 fsockopen()也可以這樣做嗎?

幾個問題:

  1. 我看到這個例子,http://phplens.com/phpeverywhere/?q=node/view/254,使用fsockopen()。這將允許我並行運行PHP腳本嗎?請注意,這些腳本不會相互影響,但我仍然想知道它們中的任何一個是否過早退出並出現錯誤。

  2. 其次,我運行的腳本不能從外部訪問,它們只在內部使用。該腳本以前運行如下:php -f /path/to/my/script1.php。這不是一個網絡可訪問的路徑。 #1中的示例是否可以使用此功能,或者只能使用網絡可訪問的路徑?

感謝您提供任何建議。

+1

由於sockopen通過連接到服務器偵聽來工作,如果這些文件不可通過網絡訪問,則無法使用它來訪問它們。 –

+0

提示 - 預計長時間運行的腳本可能會崩潰,並計劃重新啓動/恢復。 – goat

回答

1

您可以使用proc_open運行多個進程而無需等待每個進程完成。 您將擁有一個流程句柄,您可以隨時終止每個流程,並且可以讀取每個流程的標準輸出。

您還可以通過管道進行通信,這是可選的。

傳遞1st參數php /your/path/to/script.php param1 "param2 x"意味着啓動一個單獨的PHP進程。

proc_open (see Example #1)

最終你會希望使用一個無限while循環+ usleep(或休眠),以避免在CPU上盡了全力。所有進程完成時或在殺死它們後中斷。

編輯:你可以知道一個過程是否過早退出。

EDIT2:上面做的簡單的方法是popen

+0

我也可以使用exec()並行運行進程嗎?如果你在後臺運行它,那是平行的,對吧? –

+0

不,exec等待過程完成,並且您無法控制它。您可以運行一個進程,但不能並行運行多個進程。 –

+0

PHP.net這樣說: 「如果一個程序是用這個函數啓動的,爲了讓它繼續在後臺運行,程序的輸出必須被重定向到一個文件或另一個輸出流,否則將會失敗導致PHP掛起,直到程序執行結束。「 所以我應該能夠並行運行,對吧? 但是我能看到它們什麼時候完成? –

1

請糾正我,如果我錯了,但如果我理解正確的事情,Tiberiu-約努茨斯坦提出的解決方案意味着開始proc_open的過程和等待它們完成將不會作爲cron腳本運行,而是正在運行的程序/服務的一部分,對嗎?

就我所瞭解的cron作業而言,控制器腳本user920050正在考慮使用將由cron按計劃啓動,並且每個新實例都會重新啓動這些進程,等待它們完成並可能與其他cron啓動的控制器腳本實例並行運行。