建立一個可以控制的資源控制代碼,通過控制資源控制代碼逾時來控制file_get_contents這個方法的逾時時間,使用起來很方便,也很簡單。
| 代碼如下 |
複製代碼 |
$context = stream_context_create(array( 'http' => array( 'timeout' => 3000 //逾時時間,單位為秒 ) )); // Fetch the URL's contents $contents = file_get_contents('http://www.111cn.net', 0, $context);
|
一、增加逾時的時間限制
這裡需要注意:set_time_limit只是設定你的PHP程式的逾時時間,而不是file_get_contents函數讀取URL的逾時時間。
我一開始以為set_time_limit也能影響到file_get_contents,後來經測試,是無效的。真正的修改file_get_contents延時可以用resource $context的timeout參數:
| 代碼如下 |
複製代碼 |
$opts = array( 'http'=>array( 'method'=>"GET", 'timeout'=>60, ) ); $context = stream_context_create($opts); $html =file_get_contents('http://www.111cn.net', false, $context); |
二、一次有延時的話那就多試幾次
有時候失敗是因為網路等因素造成,沒有解決辦法,但是可以修改程式,失敗時重試幾次,仍然失敗就放棄,因為file_get_contents()如果失敗將返回 FALSE,所以可以下面這樣編寫代碼:
| 代碼如下 |
複製代碼 |
$cnt=0; while($cnt < 3 && ($str=@file_get_contents('http...'))===FALSE) $cnt++; |
以上方法對付逾時已經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' => 'test@gmail.com', 'submit' => 'submit', ); echo Post('http://www.111cn.net', $data); |