我有一個PHP腳本,必須使用exec在後臺啓動第二個腳本。父腳本需要捕獲這個新進程的PID,但我還需要捕獲子腳本的任何可能輸出,以便它可以記錄在數據庫中。我不能只將子腳本登錄到數據庫,因爲我還需要捕獲致命錯誤或任何可能表明腳本出現問題的東西。使用PID是因爲父進程需要能夠檢查子進程並查看完成時間。子進程有時以cron的形式運行,所以分叉也不是這裏的選項。如果有問題,我不希望兩個執行路徑進行調試。如何在同一時間捕獲後臺PHP過程的PID和輸出?
這是我的第一個解決方案,它可以捕獲輸出,但無法獲得正確的PID。
// RedirectToLog.php just reads stdin and logs it to the databse.
$cmd="php child.php </dev/null 2>&1 | php RedirectToLog.php >/dev/null 2>&1 & echo $!";
這裏的問題是$!是在後臺啓動的最後一個進程的PID,最終進程是RedirectToLog.php而不是child.php。
我的另一個想法是嘗試使用FIFO文件(管道)。
$cmd1="php RedirectToLog.php </tmp/myFIFO >/dev/null 2>&1 &"
$cmd2="php child.php </dev/null >/tmp/myFIFO 2>&1 & echo $!"
這一個沒有工作,因爲我無法得到RedirectToLog可靠地消耗FIFO和當它沒有,有時child.php沒有寫EOF到留下兩端等待其他的管這兩個過程都會掛起,直到一個人死亡。