探讨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新手入门学习方法
May 08 PHP
PHP异步调用socket实现代码
Jan 12 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
Mar 11 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 PHP
thinkPHP学习笔记之安装配置篇
Mar 05 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
详解EventDispatcher事件分发组件
Dec 25 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
Feb 04 PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 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脚本的10个技巧(2)
2006/10/09 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
jquery调用wcf并展示出数据的方法
2011/07/07 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
学习Node.js模块机制
2016/10/17 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
Ajax基础知识详解
2017/02/17 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
python+django快速实现文件上传
2016/10/24 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
python实现弹跳小球
2019/05/13 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
澳大利亚最大的百货公司:Myer
2018/12/21 全球购物
元宵晚会主持词
2014/03/25 职场文书
租房协议书怎么写
2014/04/10 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
七一讲话心得体会
2014/09/05 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
初中思品教学反思
2016/02/20 职场文书