2012-03-05 15 views
0

我有一個PHP passthru()阻塞時,它應該啓動守護進程的問題。PHP passthru()塊與進程更換

我有一個Node.js守護進程和一個bash腳本包裝器。該bash腳本使用了一些進程替換,因爲Node.js服務器不能直接登錄到syslog。在bash腳本包含這樣的命令:

forever -l app.log app.js 

但是,因爲我希望它記錄到系統日誌,我使用:

forever -l >(logger) app.js 

logger處理替換創建的文件描述符像/dev/fd/63傳遞其路徑以forever命令作爲要使用的日誌文件。

當我直接使用bash腳本啓動守護程序時,這種方式很好用,但是當使用PHP passthru()或exec()執行bash腳本時,這些調用將會阻塞。如果我使用常規日誌文件而不是進程替換,那麼passthru()和exec()都可以正常工作,在後臺啓動守護進程。

我已經創建了一個完整的工作示例(使用一個簡單的PHP後臺程序代替的Node.js)在Github上的要點是:https://gist.github.com/1977896(需要PHP 5.3.6+)

爲什麼在過程中更換passthru()通話塊?我能做些什麼來解決它嗎?

回答

0

passthru()會阻塞在PHP中,即使你啓動了一個守護進程,這也是不幸的。我聽說有些人有運氣的nohup重寫它:

exec('/path/to/cmd'); 

就變成了:

exec('nohup /path/to/cmd &'); 

就個人而言,我經歷過最多的運氣是EXEC()'荷蘭國際集團一高管的wget調用另一個腳本(或相同的腳本)來實際運行阻塞exec。通過將呼叫過程提供給與活動用戶無關的另一個http進程,可以避免呼叫進程被阻止。使用合適的標誌,wget的將立即返回,而不是等待響應:

exec('wget --quiet --tries=1 -O - --timeout=1 --no-cache http://localhost/path/to/cmd'); 

的HTTP處理程序將最終超時這是很好的,應該離開後臺程序。如果您需要輸出(因此您正在進行passthru()調用),只需運行腳本將輸出重定向到一個文件,然後輪詢該文件以查看實時進程中的更改。