首頁  >  文章  >  後端開發  >  file_get_contents 函數新增逾時設定

file_get_contents 函數新增逾時設定

巴扎黑
巴扎黑原創
2016-11-24 13:56:151325瀏覽

在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 腳本最大執行時間是必要的,但是,治標不治本。例如改成30s,如果發生file_get_contents() 取得網頁內容較慢的情況,這表示150 個php-cgi 進程,每秒鐘只能處理5 個請求,WebServer 同樣很難避免「502 Bad Gateway」。


  要做到徹底解決,只能讓PHP 程式設計師改掉直接使用file_get_contents("http://example.com/") 的習慣,而是稍微修改一下,加個超時時間,用以下方式來實現HTTP GET 請求。要是覺得麻煩,可以自行將以下程式碼封裝成一個函數。

<?php  
$ctx = stream_context_create(array(  
   &#39;http&#39; => array(  
       &#39;timeout&#39; => 1 //设置一个超时时间,单位为秒  
       )  
   )  
);  
file_get_contents("http://example.com/", 0, $ctx);  
?>


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn