windows service 2012 R2使用 PHP經過file_get_contents()方法不能正常獲取遠程網頁內容

     這兩天,公司的一個客戶的舊汽車系統裏的車庫不能更新,我經過斷點打印發現是一個方法獲取遠程網頁內容失敗,開始懷疑是一個自定義封裝好的方法出錯。在諮詢老員工後,我果斷替換爲file_get_contents()方法執行。但是,神奇的事情發生了,開始刷新頁面成功獲取到遠程網頁內容,可是在接下來幾回重複測試後,發現依舊獲取遠程網頁內容失敗……因而按着老員工的意思,探索服務器對file_get_contents()設置限制的問題。php

        首先,檢查服務器的PHP是否支持訪問URL對象(例如文件)。經過找到PHP的配置文件php.ini,把allow_url_fopen設置爲On,即allow_url_fopen = On。但是,通過檢查發現,客戶的服務器已經激活了URL形式的fopen封裝協議。html

        接着,繼續百度尋找服務器限制file_get_contents()的解決方法。(剛剛得知程序猿是不要使用百度的,都是FQ使用google。。。具體緣由嘛,或許百度的確找到的大可能是無用的信息。小弟不才,請容我先學會翻越偉大的GFW[GREAT FIRE WALL]。)因而乎,我找到了都是使用curl替代file_get_contents()的方法,大概以下:bash

        許多做爲虛擬主機出租的服務器,通常都會把file_get_contents、fsockopen等一些IO操做的函數禁用掉,由於它們怕被 DDOS。可是許多站長有須要用到這種函數來抓取URL頁面內容,好比說我須要抓取各大網站UED博客裏的RSS內容,輸出到個人首頁。那麼通常狀況下,咱們改不了服務器的 inc.php,只能本身寫一套IO來代替上面的PHP函數了。服務器

$url = file_get_contents('http://www.chongqingwangzhai.com/');
  • 1

        咱們能夠用下面的代碼代替網絡

//禁用file_get_contents的解決辦法
$ch = curl_init(); $timeout = 10; // set to zero for no timeout curl_setopt ($ch, CURLOPT_URL,'http://www.chongqingwangzhai.com/'); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $url = curl_exec($ch);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

        curl是一個利用URL語法規定來傳輸文件和數據的工具,支持不少協議,如HTTP、FTP、TELNET等,它不會被服務器禁用,因此咱們能夠用來模擬file_get_contents同樣打開一條URL。 
        而通常咱們要抓取頁面數據,例如新浪微博、百度論壇等得頁面,都須要登陸狀態下才能進入列表頁面,因此這個時候就須要用curl模擬登陸,再打開URL,原理就是利用curl設置http訪問的頭部信息,模擬登陸的頭部信息,讓對方服務器認爲你是在登陸狀態。具體實現方法就不說了,網上不少。 
(參考網址:http://blog.csdn.net/pengyouchuan/article/details/7205440curl

        可是,根據以上方法替換後,結果依舊失敗!函數

        後來,懷疑是服務器防火牆限制。偶爾發現,經過ping有關網址出現部分ping失敗的狀況。據瞭解,有多是服務器DNS解析有問題。網上有網友提到,經過修改/etc/hosts文件來解決問題。不過,我仍是先了解一下hosts文件及其做用:工具

        /etc/hosts,主機名和ip配置文件。 
        hosts—The static table lookup for host name(主機名查詢靜態表)測試

        咱們知道在網絡上訪問網站,要首先經過DNS服務器把網絡域名(www.XXXX.com)解析成XXX.XXX.XXX.XXX的IP地址後,咱們的計算機才能訪問。要是對於每一個域名請求咱們都要等待域名服務器解析後返回IP信息,這樣訪問網絡的效率就會下降,而Hosts文件就能提升解析效率。根據Windows系統規定,在進行DNS請求之前,Windows系統會先檢查本身的Hosts文件中是否有這個地址映射關係,若是有則調用這個IP地址映射,若是沒有再向已知的DNS 服務器提出域名解析。也就是說Hosts的請求級別比DNS高。網站

        因此,咱們能夠經過事先在Hosts文件中配置好對應的地址映射關係,從而達到一系列效果。好比:一、加快域名解析;二、方便局域網用戶;三、屏蔽網站;四、順利鏈接系統;等等。 
(參考網址:http://blog.sina.com.cn/s/blog_6714fba701018pip.html) 
(參考網址:http://blog.sina.com.cn/s/blog_6714fba701018pip.html

        根據以上的方法,我把遠程車庫(目標服務器)的IP地址等信息配置到客戶服務器的Hosts文件裏面,刷新網站,從新點擊測試功能。

        遠程網頁內容獲取成功!!!

        通過屢次刷新測試,系統依舊能正常獲取遠程網頁內容!至此,「PHP下經過file_get_contents()方法不能正常獲取遠程網頁內容」這個問題基本解決。

 

  若是仍是不行,推薦使用CURL。

  轉載至http://blog.csdn.net/hiking_tsang/article/details/72717196

相關文章
相關標籤/搜索