探讨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 相关文章推荐
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
用php实现批量查询清除一句话后门的代码
Jan 20 PHP
PHP Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
PHP安全配置详细说明
Sep 26 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
May 08 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
php 获取xml接口数据的处理方法
May 31 PHP
PHP日志LOG类定义与用法示例
Sep 06 PHP
laravel配置Redis多个库的实现方法
Apr 10 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 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
SONY SRF-40W电路分析
2021/03/02 无线电
PHP 中执行系统外部命令
2006/10/09 PHP
php5.2时间相差8小时
2007/01/15 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
DOM 事件流详解
2015/01/20 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
React组件refs的使用详解
2018/02/09 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
python使用tornado实现简单爬虫
2018/07/28 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
Python通过format函数格式化显示值
2020/10/17 Python
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
学生出入校管理制度
2014/01/16 职场文书
银行批评与自我批评
2014/02/10 职场文书
班委竞选演讲稿
2014/04/28 职场文书
社团活动总结格式
2014/08/29 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
员工福利申请报告
2015/05/15 职场文书
法定代表人免职证明
2015/06/24 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
写好Python代码的几条重要技巧
2021/05/21 Python
Python 用户输入和while循环的操作
2021/05/23 Python