探讨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中路径问题的解决方案
Oct 09 PHP
PHP的FTP学习(三)
Oct 09 PHP
PHP中copy on write写时复制机制介绍
May 13 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
php面向对象编程self和static的区别
May 08 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
Jun 13 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
PHP判断函数是否被定义的方法
Jun 21 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
Feb 07 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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
Python跳出循环语句continue与break的区别
2014/08/25 Python
Python中实现的RC4算法
2015/02/14 Python
Python调用命令行进度条的方法
2015/05/05 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
python 生成器协程运算实例
2017/09/04 Python
python计算日期之间的放假日期
2018/06/05 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
python如何查看网页代码
2020/06/07 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
sort命令的作用和用法
2012/11/04 面试题
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
24岁生日感言
2014/01/13 职场文书
学校介绍信范文
2014/01/14 职场文书
接受捐赠答谢词
2014/01/27 职场文书
说明书怎么写
2014/05/06 职场文书
2016年春节慰问信息
2015/03/25 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python