探讨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 相关文章推荐
再次研究下cache_lite
Feb 14 PHP
PHP 读取和修改大文件的某行内容的代码
Oct 30 PHP
php 计划任务 检测用户连接状态
Mar 29 PHP
PHP防盗链代码实例
Aug 27 PHP
PHP使用ODBC连接数据库的方法
Jul 18 PHP
通过Email发送PHP错误的方法
Jul 20 PHP
php根据用户语言跳转相应网页
Nov 04 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 09 PHP
Laravel中服务提供者和门面模式的入门介绍
Nov 06 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 PHP
php生成短网址/短链接原理和用法实例分析
May 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版网站缓存加快打开速度的方法分享
2012/06/03 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
ES6中Array.includes()函数的用法
2017/09/20 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
vue百度地图 + 定位的详解
2019/05/13 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
护士求职推荐信范文
2013/11/23 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
2015年语文教学工作总结
2015/05/25 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android