探讨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 相关文章推荐
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
Oct 31 PHP
php实现快速排序法函数代码
Aug 27 PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 PHP
php过滤XSS攻击的函数
Nov 12 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
destoon调用discuz论坛中带图片帖子的实现方法
Aug 21 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
Jun 17 PHP
php文件上传类的分享
Jul 06 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
php遍历目录下文件并按修改时间排序操作示例
Jul 12 PHP
php面向对象重点知识分享
Sep 27 PHP
laravel执行php artisan migrate报错的解决方法
Oct 09 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
东方红 - 来复式再生机的修复
2021/03/02 无线电
PHP中的extract的作用分析
2008/04/09 PHP
php模板引擎技术简单实现
2016/03/15 PHP
php集成动态口令认证
2016/07/21 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
php多进程应用场景实例详解
2019/07/22 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
基于python实现地址和经纬度转换
2020/05/19 Python
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
升职自荐信
2013/11/28 职场文书
大学生工作推荐信范文
2013/12/02 职场文书
客户答谢会活动方案
2014/08/31 职场文书
谢师宴家长答谢词
2015/09/30 职场文书