探讨file_get_contents与curl效率及稳定性的分析


Posted in PHP onJune 06, 2013

做过好多抓取别家网站内容的产品,习惯了使用方便快捷的file_get_contents函数,但是总是会遇到获取失败的问题,尽管按照手册中的例子设置了超时,可多数时候不会奏效:

$config['context'] = stream_context_create(array(‘http' => array(‘method' => “GET”,
   'timeout' => 5//这个超时时间不稳定,经常不奏效
   )
  ));

这时候,看一下服务器的连接池,会发现一堆类似的错误,让你头疼万分:
file_get_contents(http://***): failed to open stream…
不得已,安装了curl库,写了一个函数替换:
<span style="color:#000000; font-weight:bold">function</span> curl_file_get_contents<span style="color:#009900">(</span><span style="color:#000088">$durl</span><span style="color:#009900">)</span><span style="color:#009900">{</span>
   <span style="color:#000088">$ch</span> <span style="color:#339933">=</span> <span style="color:#990000">curl_init</span><span style="color:#009900">(</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#990000">curl_setopt</span><span style="color:#009900">(</span><span style="color:#000088">$ch</span><span style="color:#339933">,</span> CURLOPT_URL<span style="color:#339933">,</span> <span style="color:#000088">$durl</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#990000">curl_setopt</span><span style="color:#009900">(</span><span style="color:#000088">$ch</span><span style="color:#339933">,</span> CURLOPT_TIMEOUT<span style="color:#339933">,</span> <span style="color:#cc66cc">5</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#990000">curl_setopt</span><span style="color:#009900">(</span><span style="color:#000088">$ch</span><span style="color:#339933">,</span> CURLOPT_USERAGENT<span style="color:#339933">,</span> _USERAGENT_<span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#990000">curl_setopt</span><span style="color:#009900">(</span><span style="color:#000088">$ch</span><span style="color:#339933">,</span> CURLOPT_REFERER<span style="color:#339933">,</span>_REFERER_<span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#990000">curl_setopt</span><span style="color:#009900">(</span><span style="color:#000088">$ch</span><span style="color:#339933">,</span> CURLOPT_RETURNTRANSFER<span style="color:#339933">,</span> <span style="color:#cc66cc">1</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#000088">$r</span> <span style="color:#339933">=</span> <span style="color:#990000">curl_exec</span><span style="color:#009900">(</span><span style="color:#000088">$ch</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#990000">curl_close</span><span style="color:#009900">(</span><span style="color:#000088">$ch</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#b1b100">return</span> <span style="color:#000088">$r</span><span style="color:#339933">;</span>
 <span style="color:#009900">}</span>

如此,除了真正的网络问题外,没再出现任何问题。
这是别人做过的关于curl和file_get_contents的测试:
file_get_contents抓取google.com需用秒数:
2.31319094
2.30374217
2.21512604
3.30553889
2.30124092
curl使用的时间:
0.68719101
0.64675593
0.64326
0.81983113
0.63956594
差距很大吧?呵呵,从我使用的经验来说,这两个工具不只是速度有差异,稳定性也相差很大。建议对网络数据抓取稳定性要求比较高的朋友使用上面的curl_file_get_contents函数,不但稳定速度快,还能假冒浏览器欺骗目标地址哦!
PHP 相关文章推荐
改进的IP计数器
Oct 09 PHP
php截取后台登陆密码的代码
May 05 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
基础的WordPress插件制作教程
Nov 24 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
PHP封装函数实现生成随机的字符串验证码
Jan 24 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
Jun 30 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 PHP
laravel 解决Validator使用中出现的问题
Oct 25 PHP
基于PHP+mysql实现新闻发布系统的开发
Aug 06 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 PHP
$_GET['goods_id']+0 的使用详解
Jun 06 #PHP
PHP编码规范的深入探讨
Jun 06 #PHP
PHP输出XML到页面的3种方法详解
Jun 06 #PHP
PHP转换文件夹下所有文件编码的实现代码
Jun 06 #PHP
利用PHP实现图片等比例放大和缩小的方法详解
Jun 06 #PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 #PHP
解决PHP超大文件下载,断点续传下载的方法详解
Jun 06 #PHP
You might like
php继承的一个应用
2011/09/06 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
php文件缓存方法总结
2016/03/16 PHP
php单例模式的简单实现方法
2016/06/10 PHP
php防止sql注入的方法详解
2017/02/20 PHP
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
学习vue.js计算属性
2016/12/03 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python实现坦克大战
2020/04/24 Python
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
组织关系转移介绍信
2014/01/16 职场文书
办公室文员自荐书
2014/02/03 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS