1. 程式人生 > >使用file_get_contents函式需要注意的地方

使用file_get_contents函式需要注意的地方

在工作過程中,有一次用到file_get_contents函式來獲取微信使用者的openid,如下圖所示。
在這裡插入圖片描述
然後同事提醒需要設定超時時間,就網上查了下相關資料,總結如下:
從php5開始,file_get_contents已經支援context了,也就是說,從php5開始,file_get_contents其實也可以用來POST傳遞資料了。
通常,file_get_contents是用於將檔案的內容讀入到一個字串的首選方法,如果作業系統支援,還會使用記憶體對映技術來增強效能。
file_get_contents支援四個引數filename、include_path、context、start、max_length,我們最常用到的就是filename了,表示要讀取的檔案,是必需引數,include_path可選引數,如果想在include_path中搜尋檔案的話,設定為1,否則,設定為false,context可選,規定檔案控制代碼的環境,context是一套可以修改流的行為的選項,使用null則表示忽略,start可選,用於規定在檔案中開始讀取的位置,max_length可選,規定讀取的位元組數。
File_get_contents可安全用於二進位制物件。
在跨伺服器提交的時候,不可避免的會遇到超時的情況,使用set_time_limt設定php的超時時間是沒用的,只有用context中的timeout時間來控制,在這裡,我們不是在抑制連線超時,而是要管理。
比如在超時返回錯誤後,進行一次嘗試,就象js中的settimeout那樣,對函式進行重新處理。錯誤超過3次或者5次後,我們認為無法連線伺服器而徹底放棄連線。這種思想,不僅僅是file_get_contents,只要支援context的都應該加上,避免超時浪費時間,這樣可以被支援的函式在致有fsocketopen(該函式的最後一個引數,該連線時限僅在套接字連線的時候生效。如果要對建立在套接字基礎上的讀寫操作時間設定連線時限,比較推薦在讀取stream的時候,使用stream_time_out函式進行控制)、fopen、file、curl(curl有自己的變數CURLOPT_TIMEOUT)等。
改寫後的獲取:
在這裡插入圖片描述


考慮到有時候連線失敗是因為網路待因素造成的,沒有比較好的解決辦法,但是可以修改程式,失敗時重試幾次,仍然失敗就放棄。
以上是針對get方法的file_get_contents設定超時時間,那麼post方法呢?
網上查了下資料,有人給出了山寨版的post傳值函式,如下:
在這裡插入圖片描述