從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)等 。
一、增加超時的時間限制
這里需要注意: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'=>1,//單位秒 ) ); $cnt=0; while($cnt<3 && ($bb=file_get_contents("http://www.jb51.net", false, stream_context_create($opts)))===FALSE) $cnt++; echo $cnt; echo $bb;
二、一次有延時的話那就多試幾次
有時候失敗是因為網絡等因素造成,沒有解決辦法,但是可以修改程序,失敗時重試幾次,仍然失敗就放棄,因為file_get_contents()如果失 敗將返回 FALSE,所以可以下面這樣編寫代碼:
$cnt=0; while($cnt<3 && ($bb=file_get_contents("http://www.jb51.net", false, stream_context_create($opts)))===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' => 'admin@admin.com', 'submit' => 'submit', ); echo Post ( 'http://www.jb51.net', $data );
OK , 上面函數完美了,既解決了超時控制又解決了Post傳值。