探讨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 相关文章推荐
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
Mar 01 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
ThinkPHP分页实例
Oct 15 PHP
php实现utf-8转unicode函数分享
Jan 06 PHP
分享一个Laravel好用的Cache宏
Mar 02 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
PHP实现根据图片色界在不同位置加水印的方法
Aug 08 PHP
Yii中的cookie的发送和读取
Jul 27 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
PHP函数积累总结
Mar 19 PHP
Laravel使用RabbitMQ的方法示例
Jun 18 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
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
python中sets模块的用法实例
2014/09/30 Python
python3实现磁盘空间监控
2018/06/21 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
Python中的集合介绍
2019/01/28 Python
如何使用Pytorch搭建模型
2020/10/26 Python
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
精选干货:Java精选笔试题附答案
2014/01/18 面试题
四年的个人工作自我评价
2013/12/10 职场文书
教师远程培训感言
2014/03/06 职场文书
大学生活自我评价
2014/04/09 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
2014年应急工作总结
2014/12/11 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
医学会议开幕词
2016/03/03 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
MySQL中一条update语句是如何执行的
2022/03/16 MySQL