file_get_contents設置超時

話說,從PHP5開始,file_get_content已經支持context了(手冊上寫着:5.0.0 Added the context support. ),也就是說,從5.0開始,file_get_contents其實也能夠POST數據。服務器

今天說的這篇是講超時的,確實在跨服務器提交的時候,不可避免的會遇到超時的狀況,這個時候怎麼辦?set_time_limit是沒有用的,只有用context中的timeout時間來控制。相反,咱們不是要抑止,而是要管理。好比在超時返回錯誤後,進行一次嘗試,就象js中的 settimeout那樣,對函數從新處理。錯誤超過3次或者5次後,咱們就確實的認爲沒法鏈接服務器而完全放棄。這,是一個好辦法,應該值得推薦使用。其實。不全是file_get_contents,只要支持context的都應該加上,避免超時浪費時間。這樣能夠被支持的函數大體有:fsocketopen(該函數的最後一個參數。好象比較推薦在讀stream的時候,使用stream_time_out函數進行控制),fopen(也是從PHP5開始加入context支持),file(PHP5加入支持),curl(curl有自已的變量 CURLOPT_TIMEOUT)等 。網絡

在使用file_get_contents函數的時候,常常會出現超時的狀況,在這裏要經過查看一下錯誤提示,看看是哪一種錯誤,比較常見的是讀取超 時,這種狀況你們能夠經過一些方法來儘可能的避免或者解決。這裏就簡單介紹兩種:curl

1、增長超時的時間限制socket

這裏須要注意:set_time_limit只是設置你的PHP程序的超時時間,而不是file_get_contents函數讀取URL的超時時 間。函數

我一開始覺得set_time_limit也能影響到file_get_contents,後來經測試,是無效的。真正的修改 file_get_contents延時能夠用resource $context的timeout參數:post


$opts = array(   
  'http'=>array(   
    'method'=>"GET",   
    'timeout'=>1,//單位秒  
   )   
);    

 $cnt=0;   
while($cnt<3 && ($bb=file_get_contents("//www.jb51.net", false, stream_context_create($opts)))===FALSE) $cnt++;   
echo $cnt;   
echo $bb;  測試

 

2、一次有延時的話那就多試幾回ui

有時候失敗是由於網絡等因素形成,沒有解決辦法,可是能夠修改程序,失敗時重試幾回,仍然失敗就放棄,由於file_get_contents()若是失 敗將返回 FALSE,因此能夠下面這樣編寫代碼:url


$cnt=0;   
 while($cnt<3 && ($bb=file_get_contents("//www.jb51.net", false, stream_context_create($opts)))===FALSE) $cnt++;.net

 

以上方法對付超時已經OK了。那麼Post呢?細心點有人發現了'method'=>」GET」, 對!是否是能設置成post呢?百度找了下相關資料,還真能夠!並且有人寫出了山寨版的post傳值函數,以下:


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 ( '//www.jb51.net', $data );  

 

OK , 上面函數完美了,既解決了超時控制又解決了Post傳值。

相關文章
相關標籤/搜索