探讨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 str_pad 函数使用详解
Jan 13 PHP
用PHP将网址字符串转换成超链接(网址或email)
May 25 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
PHP生成二维码的两个方法和实例
Jul 01 PHP
php自定义函数实现二维数组排序功能
Jul 20 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PDO::lastInsertId讲解
Jan 29 PHP
浅谈laravel中的关联查询with的问题
Oct 10 PHP
php7性能提升的原因详解
Oct 13 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 PHP
THINKPHP5分页数据对象处理过程解析
Oct 28 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 header功能的使用
2013/10/28 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
微信小程序表单弹窗实例
2018/07/19 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
python with statement 进行文件操作指南
2014/08/22 Python
Python读写Excel文件方法介绍
2014/11/22 Python
python3简单实现微信爬虫
2015/04/09 Python
python插入排序算法实例分析
2015/07/03 Python
常用python编程模板汇总
2016/02/12 Python
Flask框架web开发之零基础入门
2018/12/10 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Python基于locals返回作用域字典
2020/10/17 Python
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
给领导的检讨书
2014/02/16 职场文书
运动员获奖感言
2014/08/15 职场文书
移交协议书
2014/08/19 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
优秀团支部申报材料
2014/12/26 职场文书
2015年统战工作总结
2015/05/19 职场文书
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android