探讨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警告Cannot use a scalar value as an array的解决方法
Jan 11 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
php内核解析:PHP中的哈希表
Jan 30 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
Nov 01 PHP
php实现对象克隆的方法
Jun 20 PHP
laravel学习笔记之模型事件的几种用法示例
Aug 15 PHP
PHP _construct()函数讲解
Feb 03 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
Yii redis集合的基本使用教程
Jun 14 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
Aug 11 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
javascript 正则表达式相关应介绍
2012/11/27 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
vue中轮训器的使用
2019/01/27 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
2019/02/21 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
一则python3的简单爬虫代码
2014/05/26 Python
Python实现二维数组输出为图片
2018/04/03 Python
基于python实现操作git过程代码解析
2020/07/27 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
一套中级Java程序员笔试题
2015/01/14 面试题
建议书标准格式
2014/03/12 职场文书
党员活动日总结
2014/05/05 职场文书
文明礼仪标语
2014/06/13 职场文书
农业项目建议书
2014/08/25 职场文书
2014年学生工作总结
2014/11/20 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
Python 如何解决稀疏矩阵运算
2021/05/26 Python
Java常用函数式接口总结
2021/06/29 Java/Android
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
Android 中的类文件和类加载器详情
2022/06/05 Java/Android