PHP http請(qǐng)求超時(shí)問(wèn)題解決方案
一,http請(qǐng)求超時(shí)時(shí)間
可能出現(xiàn)的場(chǎng)景:
1,curl進(jìn)程運(yùn)行了一個(gè)世紀(jì)還木結(jié)束,curl的時(shí)候設(shè)置了超時(shí)時(shí)間 --connect-timeout 1000
2,operation timed out after 1000 milliseconds with 0 bytes received
3,connect() timed out!
wget對(duì)超時(shí)時(shí)間, 是有分階段的, 比如說(shuō)請(qǐng)求的超時(shí), 傳輸?shù)某瑫r(shí),同樣HTTP請(qǐng)求有兩個(gè)超時(shí)時(shí)間:一個(gè)是連接超時(shí)時(shí)間,另一個(gè)是數(shù)據(jù)傳輸?shù)淖畲笤试S時(shí)間,出現(xiàn)問(wèn)題就要看是哪個(gè)超時(shí)時(shí)間出問(wèn)題了。
curl命令行
連接超時(shí)時(shí)間用 --connect-timeout 參數(shù)來(lái)指定,數(shù)據(jù)傳輸?shù)淖畲笤试S時(shí)間用 -m 參數(shù)來(lái)指定,時(shí)間是毫秒
例如:
curl --connect-timeout 10 -m 20 "http://***"
連接超時(shí)的話(huà),出錯(cuò)提示形如:
curl: (28) connect() timed out!
數(shù)據(jù)傳輸?shù)淖畲笤试S時(shí)間超時(shí)的話(huà),出錯(cuò)提示形如:
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);
//連接超時(shí)時(shí)間 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1000);
//數(shù)據(jù)傳輸?shù)淖畲笤试S時(shí)間 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)查看錯(cuò)誤的詳情 var_dump(curl_error($ch));
二,頁(yè)面執(zhí)行時(shí)間
當(dāng)你的頁(yè)面有大量數(shù)據(jù)時(shí),建議使用set_time_limit()來(lái)控制運(yùn)行時(shí)間,配置該頁(yè)最久執(zhí)行時(shí)間。
設(shè)定一個(gè)程式所允許執(zhí)行的秒數(shù),如果到達(dá)限制的時(shí)間,程式將會(huì)傳回錯(cuò)誤,時(shí)間是秒單位。
php.ini:它預(yù)設(shè)的限制時(shí)間是30秒,max_execution_time的值定義在結(jié)構(gòu)檔案中,如果將秒數(shù)設(shè)為0,表示無(wú)時(shí)間上的限制,修改后重新啟動(dòng)apache/nginx服務(wù)器
php代碼:set_time_limit(800);
這個(gè)函數(shù)指定了當(dāng)前所在php腳本的最大執(zhí)行時(shí)間為800秒,實(shí)際上最大執(zhí)行時(shí)間=php.ini里的max_execution_time數(shù)值 - 當(dāng)前腳本已經(jīng)執(zhí)行的時(shí)間 + 設(shè)定值
假如php.ini里的max_execution_time=30,當(dāng)前腳本已經(jīng)執(zhí)行5秒,則:
最大執(zhí)行時(shí)間=30-5+800=825秒。
注意 : 當(dāng)PHP是執(zhí)行在安全模式時(shí),set_time_limit( )將不會(huì)有結(jié)果,除非是關(guān)閉安全模式或是修改結(jié)構(gòu)檔案中的時(shí)間限制。
三,php長(zhǎng)連接
如果我們需要一個(gè)腳本持續(xù)的運(yùn)行,那么我們就要通過(guò)php長(zhǎng)連接的方式,來(lái)達(dá)到運(yùn)行目的。通過(guò) set_time_limit 來(lái)設(shè)置一個(gè)腳本的執(zhí)行時(shí)間為無(wú)限長(zhǎng);然后使用 flush() 和 ob_flush() 來(lái)清除服務(wù)器緩沖區(qū),隨時(shí)輸出腳本的返回值。
如下面這段腳本:
<?php
header("Content-Type: text/plain");
set_time_limit(0);
$infoString = "Hello World" . "\n";
while( isset($infoString) )
{
echo $infoString;
flush();
ob_flush();
sleep(5);
}
?>
當(dāng)我們執(zhí)行后,每隔5秒鐘,我們會(huì)得到一行 Hello World ,如果不按停止按鈕,瀏覽器會(huì)不停的一行一行繼續(xù)加載。
通過(guò)這一方法,我們可以完成很多功能,例如機(jī)器人爬蟲(chóng)、即時(shí)留言板等程序。
如果要停止運(yùn)行只能重啟php-fpm:
查看php-fpm進(jìn)程數(shù):
ps aux | grep -c php-fpm
查看運(yùn)行內(nèi)存
/usr/bin/php -i|grep mem
重啟php-fpm
/etc/init.d/php-fpm restart
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
PHP--用萬(wàn)網(wǎng)的接口實(shí)現(xiàn)域名查詢(xún)功能
PHP用萬(wàn)網(wǎng)的接口實(shí)現(xiàn)域名查詢(xún)功能,需要的朋友可以了解下2012-12-12
Laravel框架之blade模板新手入門(mén)教程及小技巧
Blade 是 laravel 提供的一個(gè)簡(jiǎn)單強(qiáng)大的模板引擎。下面這篇文章主要給大家介紹了關(guān)于Laravel框架之blade模板新手的入門(mén)教程以及一些使用的小技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12
PHP 中TP5 Request 請(qǐng)求對(duì)象的實(shí)例詳解
這篇文章主要介紹了PHP 中TP5 Request 請(qǐng)求對(duì)象的實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)代碼幫助大家理解這部分內(nèi)容,需要的朋友可以參考下2017-07-07
thinkphp跨庫(kù)操作的簡(jiǎn)單代碼實(shí)例
下面小編就為大家?guī)?lái)一篇thinkphp跨庫(kù)操作的簡(jiǎn)單代碼實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
PHP實(shí)現(xiàn)用戶(hù)異地登錄提醒功能的方法【基于thinkPHP框架】
這篇文章主要介紹了PHP實(shí)現(xiàn)用戶(hù)異地登錄提醒功能的方法,基于thinkPHP框架結(jié)合用戶(hù)session實(shí)現(xiàn)異地登陸的判定功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-03-03
PHP 中 Orientation 屬性判斷上傳圖片是否需要旋轉(zhuǎn)
本文給大家介紹使用php技術(shù)實(shí)現(xiàn)根據(jù)上傳圖片orientation屬性判斷是否需要旋轉(zhuǎn),感興趣的朋友一起看看吧2015-10-10
ThinkPHP5.0框架使用build 自動(dòng)生成模塊操作示例
這篇文章主要介紹了ThinkPHP5.0框架使用build 自動(dòng)生成模塊操作,結(jié)合實(shí)例形式分析了thinkPHP5使用build自動(dòng)生成模塊的具體步驟、方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-04-04
詳解Grunt插件之LiveReload實(shí)現(xiàn)頁(yè)面自動(dòng)刷新(兩種方案)
這篇文章主要通過(guò)兩種方案詳解Grunt插件之LiveReload實(shí)現(xiàn)頁(yè)面自動(dòng)刷新,需要的朋友可以參考下2015-07-07

