這篇文章給大家分享的是PHP http請求超時的情況的解決方案,對大家解決http請求超時的問題有一定的搬小編覺得挺實用的,因此分享給大家做個參考,文中示例代碼介紹的非常詳細,感興趣的朋友接下來一起跟隨小編看看吧。
一,http請求超時時間
可能出現(xiàn)的場景:
1,curl進程運行了一個世紀還木結(jié)束,curl的時候設置了超時時間 –connect-timeout 1000
2,operation timed out after 1000 milliseconds with 0 bytes received
3,connect() timed out!
wget對超時時間, 是有分階段的, 比如說請求的超時, 傳輸?shù)某瑫r,同樣HTTP請求有兩個超時時間:一個是連接超時時間,另一個是數(shù)據(jù)傳輸?shù)淖畲笤试S時間,出現(xiàn)問題就要看是哪個超時時間出問題了。
curl命令行
連接超時時間用 –connect-timeout 參數(shù)來指定,數(shù)據(jù)傳輸?shù)淖畲笤试S時間用 -m 參數(shù)來指定,時間是毫秒
例如:
curl –connect-timeout 10 -m 20 “http://***”
連接超時的話,出錯提示形如:
curl: (28) connect() timed out!
數(shù)據(jù)傳輸?shù)淖畲笤试S時間超時的話,出錯提示形如:
curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received
使用PHP的curl_init
<?php // create a new cURL resource $ch = curl_init(); // set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, “http://www.example.com/”); curl_setopt($ch, CURLOPT_HEADER, 0);
//連接超時時間 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1000);
//數(shù)據(jù)傳輸?shù)淖畲笤试S時間 curl_setopt($ch, CURLOPT_TIMEOUT, 1000); // grab URL and pass it to the browser curl_exec($ch); // close cURL resource, and free up system resources curl_close($ch);
//使用curl_error($ch)查看錯誤的詳情 var_dump(curl_error($ch));
二,頁面執(zhí)行時間
當你的頁面有大量數(shù)據(jù)時,建議使用set_time_limit()來控制運行時間,配置該頁最久執(zhí)行時間。
設定一個程式所允許執(zhí)行的秒數(shù),如果到達限制的時間,程式將會傳回錯誤,時間是秒單位。
php.ini:它預設的限制時間是30秒,max_execution_time的值定義在結(jié)構(gòu)檔案中,如果將秒數(shù)設為0,表示無時間上的限制,修改后重新啟動apache/nginx服務器
php代碼:set_time_limit(800);
這個函數(shù)指定了當前所在php腳本的最大執(zhí)行時間為800秒,實際上最大執(zhí)行時間=php.ini里的max_execution_time數(shù)值 - 當前腳本已經(jīng)執(zhí)行的時間 + 設定值
假如php.ini里的max_execution_time=30,當前腳本已經(jīng)執(zhí)行5秒,則:
最大執(zhí)行時間=30-5+800=825秒。
注意 : 當PHP是執(zhí)行在安全模式時,set_time_limit( )將不會有結(jié)果,除非是關(guān)閉安全模式或是修改結(jié)構(gòu)檔案中的時間限制。
三,php長連接
如果我們需要一個腳本持續(xù)的運行,那么我們就要通過php長連接的方式,來達到運行目的。通過 set_time_limit 來設置一個腳本的執(zhí)行時間為無限長;然后使用 flush() 和 ob_flush() 來清除服務器緩沖區(qū),隨時輸出腳本的返回值。
如下面這段腳本:
<?php header("Content-Type: text/plain"); set_time_limit(0); $infoString = "Hello World" . "\n"; while( isset($infoString) ) { echo $infoString; flush(); ob_flush(); sleep(5); } ?>
當我們執(zhí)行后,每隔5秒鐘,我們會得到一行 Hello World ,如果不按停止按鈕,瀏覽器會不停的一行一行繼續(xù)加載。
通過這一方法,我們可以完成很多功能,例如機器人爬蟲、即時留言板等程序。
如果要停止運行只能重啟php-fpm:
查看php-fpm進程數(shù):
ps aux | grep -c php-fpm
查看運行內(nèi)存
/usr/bin/php -i|grep mem
重啟php-fpm
/etc/init.d/php-fpm restart