探讨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实现的封装验证码类详解
Jun 18 PHP
使用淘宝IP库获取用户ip地理位置
Oct 27 PHP
php设置允许大文件上传示例代码
Mar 10 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
Oct 22 PHP
yii中widget的用法
Dec 03 PHP
php通过Chianz.com获取IP地址与地区的方法
Jan 14 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 PHP
Yii全局函数用法示例
Jan 22 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
php-msf源码详解
Dec 25 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实现文件下载更能介绍
2012/11/23 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
python3.6 实现AES加密的示例(pyCryptodome)
2018/01/10 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
实习医生自我评价
2013/09/22 职场文书
实习护理工作自我评价
2013/09/25 职场文书
历史系毕业生自荐信
2013/10/28 职场文书
三年级科学教学反思
2014/01/29 职场文书
绿色出行口号
2014/06/18 职场文书
升职自荐信怎么写
2015/03/05 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python