PHP file_get_contents設(shè)置超時(shí)處理方法
file_get_contents的超時(shí)處理
話說,從PHP5開始,file_get_content已經(jīng)支持context了(手冊(cè)上寫著:5.0.0 Added the context support. ),也就是說,從5.0開始,file_get_contents其實(shí)也可以POST數(shù)據(jù)。
今天說的這篇是講超時(shí)的,確實(shí)在跨服務(wù)器提交的時(shí)候,不可避免的會(huì)遇到超時(shí)的情況,這個(gè)時(shí)候怎么辦?set_time_limit是沒有用的,只有用context中的timeout時(shí)間來控制。相反,我們不是要抑止,而是要管理。比如在超時(shí)返回錯(cuò)誤后,進(jìn)行一次嘗試,就象js中的 settimeout那樣,對(duì)函數(shù)重新處理。錯(cuò)誤超過3次或者5次后,我們就確實(shí)的認(rèn)為無法連接服務(wù)器而徹底放棄。這,是一個(gè)好辦法,應(yīng)該值得推薦使用。其實(shí)。不全是file_get_contents,只要支持context的都應(yīng)該加上,避免超時(shí)浪費(fèi)時(shí)間。這樣可以被支持的函數(shù)大致有:fsocketopen(該函數(shù)的最后一個(gè)參數(shù)。好象比較推薦在讀stream的時(shí)候,使用stream_time_out函數(shù)進(jìn)行控制),fopen(也是從PHP5開始加入context支持),file(PHP5加入支持),curl(curl有自已的變量 CURLOPT_TIMEOUT)等 。
在使用file_get_contents函數(shù)的時(shí)候,經(jīng)常會(huì)出現(xiàn)超時(shí)的情況,在這里要通過查看一下錯(cuò)誤提示,看看是哪種錯(cuò)誤,比較常見的是讀取超 時(shí),這種情況大家可以通過一些方法來盡量的避免或者解決。這里就簡單介紹兩種:
一、增加超時(shí)的時(shí)間限制
這里需要注意:set_time_limit只是設(shè)置你的PHP程序的超時(shí)時(shí)間,而不是file_get_contents函數(shù)讀取URL的超時(shí)時(shí) 間。
我一開始以為set_time_limit也能影響到file_get_contents,后來經(jīng)測(cè)試,是無效的。真正的修改 file_get_contents延時(shí)可以用resource $context的timeout參數(shù):
$opts = array(
'http'=>array(
'method'=>"GET",
'timeout'=>1,//單位秒
)
);
$cnt=0;
while($cnt<3 && ($bb=file_get_contents("http://chabaoo.cn", false, stream_context_create($opts)))===FALSE) $cnt++;
echo $cnt;
echo $bb;
二、一次有延時(shí)的話那就多試幾次
有時(shí)候失敗是因?yàn)榫W(wǎng)絡(luò)等因素造成,沒有解決辦法,但是可以修改程序,失敗時(shí)重試幾次,仍然失敗就放棄,因?yàn)閒ile_get_contents()如果失 敗將返回 FALSE,所以可以下面這樣編寫代碼:
$cnt=0;
while($cnt<3 && ($bb=file_get_contents("http://chabaoo.cn", false, stream_context_create($opts)))===FALSE) $cnt++;
以上方法對(duì)付超時(shí)已經(jīng)OK了。那么Post呢?細(xì)心點(diǎn)有人發(fā)現(xiàn)了'method'=>”GET”, 對(duì)!是不是能設(shè)置成post呢?百度找了下相關(guān)資料,還真可以!而且有人寫出了山寨版的post傳值函數(shù),如下:
function Post($url, $post = null){
$context = array ();
if (is_array ( $post )) {
ksort ( $post );
$context ['http'] = array (
'timeout' => 60,
'method' => 'POST',
'content' => http_build_query( $post, '', '&' )
);
}
return file_get_contents ( $url, false, stream_context_create ( $context ) );
}
$data = array (
'name' => 'test',
'email' => 'admin@admin.com',
'submit' => 'submit',
);
echo Post ( 'http://chabaoo.cn', $data );
OK , 上面函數(shù)完美了,既解決了超時(shí)控制又解決了Post傳值。
- PHP CURL或file_get_contents獲取網(wǎng)頁標(biāo)題的代碼及兩者效率的穩(wěn)定性問題
- php中file_get_contents與curl性能比較分析
- php采用file_get_contents代替使用curl實(shí)例
- php中使用Curl、socket、file_get_contents三種方法POST提交數(shù)據(jù)
- PHP中file_get_contents高級(jí)用法實(shí)例
- PHP file_get_contents 函數(shù)超時(shí)的幾種解決方法
- PHP下通過file_get_contents的代理使用方法
- PHP中使用cURL實(shí)現(xiàn)Get和Post請(qǐng)求的方法
- PHP CURL CURLOPT參數(shù)說明(curl_setopt)
- php基于curl重寫file_get_contents函數(shù)實(shí)例
相關(guān)文章
php使用imagecopymerge()函數(shù)創(chuàng)建半透明水印
這篇文章主要介紹了php使用imagecopymerge()函數(shù)創(chuàng)建半透明水印,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01在php中判斷一個(gè)請(qǐng)求是ajax請(qǐng)求還是普通請(qǐng)求的方法
如何在php中判斷一個(gè)網(wǎng)頁請(qǐng)求是ajax請(qǐng)求還是普通請(qǐng)求?你可以通過傳遞參數(shù)的方法來實(shí)現(xiàn),例如使用如下網(wǎng)址請(qǐng)求2011-06-06PHP實(shí)現(xiàn)mysqli批量執(zhí)行多條語句的方法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)mysqli批量執(zhí)行多條語句的方法,結(jié)合實(shí)例形式分析了php連接mysqli并批量執(zhí)行多條語句的相關(guān)操作技巧,需要的朋友可以參考下2017-07-07PHP函數(shù)實(shí)現(xiàn)分頁含文本分頁和數(shù)字分頁
分頁功能是經(jīng)常使用的一個(gè)功能,因此用PHP實(shí)現(xiàn)分頁,文本分頁和數(shù)字分頁,對(duì)其以函數(shù)形式進(jìn)行了封裝2014-10-10PHP編程實(shí)現(xiàn)計(jì)算抽獎(jiǎng)概率算法完整實(shí)例
這篇文章主要介紹了PHP編程實(shí)現(xiàn)計(jì)算抽獎(jiǎng)概率算法,結(jié)合完整實(shí)例形式分析了php隨機(jī)數(shù)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-08-08PHP中file_get_contents設(shè)置header請(qǐng)求頭,curl傳輸選項(xiàng)參數(shù)詳解說明
php中遠(yuǎn)程獲取和采集內(nèi)容、實(shí)現(xiàn)PHP網(wǎng)頁版的FTP上傳下載、實(shí)現(xiàn)模擬登陸、實(shí)現(xiàn)接口數(shù)據(jù)傳輸(API)、實(shí)現(xiàn)模擬Cookie、下載文件斷點(diǎn)續(xù)傳等等,都會(huì)用到fopen、file_get_contents和curl這樣的函數(shù),當(dāng)然要對(duì)比一下了,程序架構(gòu)設(shè)計(jì)當(dāng)然要無可挑剔了。2023-07-07PHP實(shí)現(xiàn)的oracle分頁函數(shù)實(shí)例
這篇文章主要介紹了PHP實(shí)現(xiàn)的oracle分頁函數(shù),結(jié)合實(shí)例形式分析了PHP針對(duì)oracle數(shù)據(jù)庫使用rownum代替MySQL中l(wèi)imit實(shí)現(xiàn)的分頁操作相關(guān)技巧,需要的朋友可以參考下2016-01-01使用PHP接收POST數(shù)據(jù),解析json數(shù)據(jù)
本篇文章是對(duì)使用PHP接收POST數(shù)據(jù)以及json數(shù)據(jù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06