探讨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 Array交叉表实现代码
Aug 05 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
Jul 01 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
Jan 11 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
PHP获取文件行数的方法
Jun 10 PHP
php采用session实现防止页面重复刷新
Dec 24 PHP
示例详解Laravel的注册重构
Aug 14 PHP
PHP编写简单的App接口
Aug 28 PHP
php实现当前页面点击下载文件的实例代码
Nov 16 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
PHP实现多图上传和单图上传功能
May 17 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读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
js post方式传递提交的实现代码
2010/05/31 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
wxpython学习笔记(推荐查看)
2014/06/09 Python
Python 错误和异常代码详解
2018/01/29 Python
Python发送邮件实现基础解析
2020/08/14 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
旷课检讨书2000字
2014/01/14 职场文书
年度考核评语
2014/01/19 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
红色旅游心得体会
2014/09/03 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
卡特教练观后感
2015/06/08 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
python实现简易名片管理系统
2021/04/11 Python
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python