2010-07-16 27 views
0

我有一個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到留下兩端等待其他的管這兩個過程都會掛起,直到一個人死亡。

回答

1

使用proc_open得到充分的FD連接,同時啓動一個進程。以proc_open返回的資源並使用proc_get_status獲取該pid。

$descriptors = array(...); // i suggest you read php.net on this 
$pipes = array(); 
$res = proc_open($cmd,$descriptors,$pipes); 

$info = proc_get_status($res); 
echo $info['pid']; 

我還沒有完全掌握所有的問題,但這應該讓你開始。

1

我猜你唯一的原因是想要捕獲孩子PID是監測它。如果是這樣,那麼使用proc_open可能會更容易。這樣你就可以基本上打開stdin,stdout和stderr的文件句柄,並監視父類的所有內容。

相關問題