2011-05-10 41 views
1

我試圖限制shell_exec在PHP中的最大執行時間爲20秒,並獲取在此期間產生的任何輸出。如果shell_exec在少於20秒內完成,則腳本應直接進行。限制shell_exec的執行時間,並抓住任何輸出產生

更具體地說,我正在開發一個迭代通過大量的Subversion版本庫修訂版的函數。對於每個修訂版本,它都會讀取svn diff並計算添加的行數。問題是,如果在修訂中提交了非常大的文件,腳本將會掛起。因此,我試圖限制每個svn diff命令的執行時間。

popen()與sleep()組合並不是一個選項,因爲它似乎使腳本在每次迭代中睡眠20秒,而這種迭代在100次迭代中不可行。設置max_execution_time也不是一個選項,因爲它會返回致命錯誤。

回答

2

popen()proc_open仍然是一個選項,您只需要避免sleep()並自己管理執行時間。

$end = time() + 20; 
while (!feof($stream) && (time() < $end)) { 

    $output .= fread($stream); 

器一起流應設置無阻塞依然:

stream_set_blocking($stream, 0); 

輪詢這樣的輸出可能還是有點緊張,所以你應該考慮增加一個小time_nanosleep()反正。在任何一種情況下,通過time()<$end檢查,運行時間限制爲最多20秒。

相關問題