探讨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 相关文章推荐
我的论坛源代码(八)
Oct 09 PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 PHP
php自定义session示例分享
Apr 22 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
php+memcache实现的网站在线人数统计代码
Jul 04 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
微信access_token的获取开发示例
Apr 16 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
PHP生成(支持多模板)二维码海报代码
Apr 30 PHP
PHP大文件分片上传的实现方法
Oct 28 PHP
PDO::rollBack讲解
Jan 29 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按字符无乱码截取中文的方法
2015/03/27 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
Yii2第三方类库插件Imagine的安装和使用
2017/07/06 PHP
php实现微信模板消息推送
2018/03/30 PHP
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
javascript跨域刷新实现代码
2011/01/01 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
详解ES6中的let命令
2020/04/05 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
PHP7新特性简述
2017/06/11 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python求斐波那契数列示例分享
2014/02/14 Python
Python实现登陆文件验证方法
2018/10/06 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
计算机工程学院个人求职信
2013/10/05 职场文书
行政总监岗位职责
2013/12/05 职场文书
技校毕业生自荐书
2014/05/23 职场文书
2014年调度员工作总结
2014/11/19 职场文书