2014-10-01 68 views
1

在Linux的Apache服務器(Ubuntu的14.04 LTS,與APM 2.4.7 mpm_prefork和mod_php)我有PHP腳本,需要很長的時間。這些被apache殺死。阿帕奇殺死很長時間的運行過程

我們必須調整的PHP環境(的max_execution_time,參數或者set_time_limit ...)

我們沒有在日誌中任何痕跡(系統日誌,Apache訪問/錯誤日誌)

我們已經追查Apache進程與strace的:

2172 is the script process 
1939 is the apache main process 
.... 

2172 14:53:01 +++ killed by SIGKILL +++ 
1939 14:53:01 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=2172, si_status=SIGKILL, si_utime=3067, si_stime=38} --- 
+0

我建議長時間運行的PHP腳本應該在後臺(而不是在Web服務器)上運行,並在數據庫中,以「國家應該「留線索」進步。這可以在網頁瀏覽器中以「用戶友好」的方式報告。 – 2014-10-01 15:45:21

回答

1

嘗試設置ini_set('max_execution_time', -1); 或運行該腳本的根,那麼Apache將不會殺他

+0

我們嘗試了max_execution_time -1,但結果相同。 並在bash上以root身份運行腳本...腳本未被殺死。 – Inexine 2014-10-01 15:29:08

+0

你要多久執行此代碼? – Daredzik 2014-10-01 15:35:46

+0

20-30分鐘取決於處理 Apache隨機殺死腳本。 2分鐘,10分鐘,15分鐘... 少數情況下腳本不會被殺死 – Inexine 2014-10-01 16:01:37

0

另一種可能性我Apache2正在殺死這個進程,因爲它在一段時間內沒有發回任何東西。這通常發生在共享主機上。如果您使用輸出緩衝,請關閉該功能。然後每隔一段時間打印一次,立即使用flush()將信息發回給Apache。

例如;在你最長的循環中,您可以執行以下操作:

$time = time(); 
while($looping) { 
    ... Code here ... 
    if(time() > $time) { 
    echo '.'; 
    flush(); 
    //ob_flush();//If you're using output buffering (often on by default) 
    $time = time(); 
    } 
} 
+0

我們與此嘗試同時: 回聲 「
」; echo memory_get_usage(); flush(); ob_flush(); $ cpt = 0; – Inexine 2014-10-01 15:42:25

+0

這應該工作。還可以嘗試使用'set_time_limit(30)',這會增加腳本運行30秒的時間 – Nathan 2014-10-01 16:13:11

+0

我嘗試,結果相同。 – Inexine 2014-10-01 16:38:24