在PHP實際開發中很多時候我們都會用到file_get_contents 這個函數來獲取遠端頁面返回的內容,但是如果遠端回應時間很慢的話,file_get_contents() 就會一直卡在那兒,不會超時,這時候我們有時候會發現Web服務的Linux 伺服器,突然系統負載上升,使用top 指令查看,很多php-cgi 進程CPU 使用率接近100%。
我們知道,在 php.ini 中,有一個參數 max_execution_time 可以設定 PHP 腳本的最大執行時間,但是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠控制PHP 腳本最大執行時間的是php-fpm.conf 設定檔中的以下參數:
C程式碼
The timeout (in seconds) for serving
Should be used when 'max_execution_time' ini option does not stop script execution for some reason '0s' meansquest'off)o '0s' meansquest'offh' o_proout ; 預設值為0 秒,也就是說,PHP 腳本會一直執行下去。這樣,當所有的php-cgi 程序都卡在file_get_contents() 函數時,這台 WebServer 已經無法再處理新的PHP 請求了修改該參數,設定一個PHP 腳本最大執行時間是必要的,但是,治標不治本。例如改成
要做到徹底解決,只能讓PHP 程式設計師改掉直接使用file_get_contents("http://example.com/") 的習慣,而是稍微修改一下,加個超時時間,用以下方式來實現HTTP GET 請求。要是覺得麻煩,可以自行將以下程式碼封裝成一個函數。
<?php $ctx = stream_context_create(array( 'http' => array( 'timeout' => 1 //设置一个超时时间,单位为秒 ) ) ); file_get_contents("http://example.com/", 0, $ctx); ?>