这两天,公司的一个客户的旧汽车系统里的车库不能更新,我经过断点打印发现是一个方法获取远程网页内容失败,开始怀疑是一个自定义封装好的方法出错。在咨询老员工后,我果断替换为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/');
咱们能够用下面的代码代替网络
//禁用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);
curl是一个利用URL语法规定来传输文件和数据的工具,支持不少协议,如HTTP、FTP、TELNET等,它不会被服务器禁用,因此咱们能够用来模拟file_get_contents同样打开一条URL。
而通常咱们要抓取页面数据,例如新浪微博、百度论坛等得页面,都须要登陆状态下才能进入列表页面,因此这个时候就须要用curl模拟登陆,再打开URL,原理就是利用curl设置http访问的头部信息,模拟登陆的头部信息,让对方服务器认为你是在登陆状态。具体实现方法就不说了,网上不少。
(参考网址:http://blog.csdn.net/pengyouchuan/article/details/7205440)curl
可是,根据以上方法替换后,结果依旧失败!函数
后来,怀疑是服务器防火墙限制。偶尔发现,经过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