探讨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 相关文章推荐
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
PHP获取文件后缀名的三个函数
Oct 15 PHP
PHP rawurlencode与urlencode函数的深入分析
Jun 08 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
Jun 09 PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 PHP
遭遇php的in_array低性能问题
Sep 17 PHP
php的hash算法介绍
Feb 13 PHP
CodeIgniter模板引擎使用实例
Jul 15 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
CI框架AR数据库操作常用函数总结
Nov 21 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
Oct 14 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 中执行系统外部命令
2006/10/09 PHP
php使用百度天气接口示例
2014/04/22 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
PHP文件上传类实例详解
2016/04/08 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
移动端日期插件Mobiscroll.js使用详解
2016/12/19 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
学习python的几条建议分享
2013/02/10 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
Linux文件系统类型
2012/02/15 面试题
护理学毕业生求职信
2013/11/14 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
升职自荐信范文
2015/03/27 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL