探讨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 相关文章推荐
如何正确理解PHP的错误信息
Oct 09 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
Mar 27 PHP
php的declare控制符和ticks教程(附示例)
Mar 21 PHP
php与flash as3 socket通信传送文件实现代码
Aug 16 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
3种php生成唯一id的方法
Nov 23 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
Nov 16 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
阿里云的WindowsServer2016上部署php+apache
Jul 17 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
PHP大文件切割上传并带进度条功能示例
Jul 01 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 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
php AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
js压缩利器
2007/02/20 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
js+html5实现canvas绘制镂空字体文本的方法
2015/06/05 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
Python模块学习 datetime介绍
2012/08/27 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python之列表推导式的用法
2019/11/29 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
哪些情况下不应该使用索引
2015/07/20 面试题
3个CCIE对一个工程师的面试题
2012/05/06 面试题
技能竞赛活动方案
2014/02/21 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
教师听课评语大全
2014/12/31 职场文书
法学专业求职信范文
2015/03/19 职场文书
芙蓉镇观后感
2015/06/10 职场文书
高二语文教学反思
2016/02/16 职场文书
netty 实现tomcat的示例代码
2022/06/05 Servers