探讨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 各种应用乱码问题的解决方法
May 09 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
PHP实现数字补零功能的2个函数介绍
May 12 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 PHP
php实现paypal 授权登录
May 28 PHP
php微信开发自定义菜单
Aug 27 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
Apr 10 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
php的无刷新操作实现方法分析
Feb 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 裁剪图片成固定大小代码方法
2009/09/09 PHP
PHP树-不需要递归的实现方法
2016/06/21 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
深入分析原生JavaScript事件
2014/12/29 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
实践中学习AngularJS表单
2016/03/21 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
python封装对象实现时间效果
2020/04/23 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
能源工程专业应届生求职信
2014/03/01 职场文书
幼儿园小班教师寄语
2014/04/03 职场文书
青年志愿者活动方案
2014/08/17 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
英语演讲开场白
2015/05/29 职场文书
成事在人观后感
2015/06/16 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技