PHP與Apache是我們常用的Web開發技術,但是在使用過程中我們很可能遇到Apache假死現象,這時候我們該怎么辦呢?
Apache假死一般是由于PHP進程卡住或崩潰導致的,這種情況下Apache會處理不了新的請求,這就導致了整個應用程序的癱瘓。舉個例子,當我們在使用過程中出現一個死循環的情況時,可能會導致PHP卡死,而Apache的日志中并不會有任何記錄,這時候我們就需要檢查Apache錯誤日志。
[Wed Mar 22 11:39:30 2017] [error] [client 192.168.0.1] PHP Fatal error:
Maximum execution time of 5 seconds exceeded in /var/www/example.php on line 22
我們可以在Apache錯誤日志中找到是否存在這樣的錯誤提示,如果有,就說明PHP進程被卡住了。
在遇到Apache假死的情況下,我們一般需要做如下處理:
1、查看Apache錯誤日志:
tail -f /var/log/httpd/error_log
2、重啟Apache和PHP:
/sbin/service httpd restart
/sbin/service php-fpm restart
3、修改PHP腳本,避免死循環:
for ($i=0; $i< $count; $i++) {
// do something...
sleep(1); // add delay to avoid infinite loop
}
如果以上處理無法解決問題,則考慮查看PHP進程數是否過多導致進程堆積,可以通過使用getmypid()方法在代碼中獲取PHP進程號。
舉個例子,如果我們在循環里新建了一個PHP進程,但是沒有及時地釋放,那么就很可能導致PHP進程過多,從而導致Apache崩潰。下面是一個通過使用pcntl_fork()函數創建進程的例子:
for ($i=0; $i< $n; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
// error
exit();
} else if ($pid) {
// parent
pcntl_waitpid($pid, $status);
} else {
// child
// do something
exit();
}
}
在這個例子中,父進程會等待子進程,當子進程執行完后就使用exit()方法中止,這樣就可以避免PHP進程過多問題。
總之,PHP與Apache假死問題是Web開發中常見的問題,我們需要注意代碼編寫質量,保持PHP進程數量穩定,及時解決代碼中出現的死循環等問題,最終保證Web應用程序正常運行。