本文实例讲述了php中file_get_contents与curl性能比较分析。分享给大家供大家参考。具体如下:

在php中如果不仔细的去分析性能会发现file_get_contents与curl两个同很多共同点的,他们都可以采集文件打开文件,但是如果仔细一对比会发现很多不同点,下面我们一起来看看file_get_contents与curl区别。

PHP中fopen,file_get_contents,curl函数的区别:

1.fopen /file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。

2.fopen /file_get_contents 在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。

3.fopen / file_get_contents 函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。

4.curl 可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据。
file_get_contents 获取远程文件时会把结果都存在一个字符串中 fiels函数则会储存成数组形式

因此,我还是比较倾向于使用curl来访问远程url。Php有curl模块扩展,功能很是强大。

说了半天大家可能说性能怎么没对比呢,那我们就来看看

最近需要获取别人网站上的音乐数据。用了file_get_contents函数,但是总是会遇到获取失败的问题,尽管按照手册中的 例子设置了超时,可多数时候不会奏效:

复制代码代码如下:
$config['context'] = stream_context_create(array('http' => array('method' => "GET",
   'timeout' => 5//这个超时时间不稳定,经常不奏效
   )
));

这时候,看一下服务器的连接池,会发现一堆类似的错误,让我头疼万分:

file_get_contents(http://***): failed to open stream…
现在改用了curl库,写了一个函数替换:

复制代码代码如下:
function curl_file_get_contents($durl){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $durl);
  curl_setopt($ch, CURLOPT_TIMEOUT, 5);
  curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
  curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $r = curl_exec($ch);
  curl_close($ch);
   return $r;
}

如此,除了真正的网络问题外,没再出现任何问题。
这是别人做过的关于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函数,不但稳定速度快,还能假冒浏览器欺骗目标地址哦

再看一个实例

后续贴出了curl和file_get_contents的对比结果,这边除了curl与file_get_contents的性能对比,还包含了他们的性能对比,讲之前看下如下的结果图:

curl与file_get_contents性能对比PHP源代码如下:

复制代码代码如下:
<?php 
/** 
 
* 通过淘宝IP接口获取IP地理位置 
 
* @param string $ip 
 
* @return: string 
 
**/
function getCityCurl($ip) 

    $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip; 
    $ch = curl_init(); 
    $timeout = 5; 
    curl_setopt ($ch, CURLOPT_URL, $url); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    $file_contents = curl_exec($ch); 
    curl_close($ch); 
  
    $ipinfo=json_decode($file_contents); 
    if($ipinfo->code=='1'){ 
        return false; 
    } 
    $city = $ipinfo->data->region.$ipinfo->data->city; 
    return $city; 

  
function getCity($ip) 

    $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip; 
    $ipinfo=json_decode(file_get_contents($url)); 
    if($ipinfo->code=='1'){ 
        return false; 
    } 
    $city = $ipinfo->data->region.$ipinfo->data->city; 
    return $city; 

  
// for file_get_contents 
$startTime=explode(' ',microtime()); 
$startTime=$startTime[0] + $startTime[1]; 
for($i=1;$i<=10;$i++) 

   echo getCity("121.207.247.202")."</br>"; 

$endTime = explode(' ',microtime()); 
$endTime = $endTime[0] + $endTime[1]; 
$totalTime = $endTime - $startTime; 
echo 'file_get_contents:'.number_format($totalTime, 10, '.', "")." seconds</br>"; 
  
//for curl 
$startTime2=explode(' ',microtime()); 
$startTime2=$startTime2[0] + $startTime2[1]; 
for($i=1;$i<=10;$i++) 

   echo getCityCurl('121.207.247.202')."</br>"; 

$endTime2 = explode(' ',microtime()); 
$endTime2=$endTime2[0] + $endTime2[1]; 
$totalTime2 = $endTime2 - $startTime2; 
echo "curl:".number_format($totalTime2, 10, '.', "")." seconds"; 
?>

测试访问
http://www.jb51.net
file_get_contents速度:4.2404510975 seconds
curl速度:2.8205530643 seconds
curl比file_get_contents速度快了30%左右,最重要的是服务器负载更低.

总结

file_get_contents处理频繁小的时候,用它感觉挺好的。没什么异常。如果你的文件被1k+人处理。那么你的服务器cpu就等着高升吧。所以建议自己和大家在以后写php代码的时候使用curl库。

希望本文所述对大家的PHP程序设计有所帮助。

php中file_get_contents与curl性能比较分析相关推荐

  1. 分页offset格式_MySQL中limit分页查询性能问题分析

    MySQL Limit 语法格式: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 分页查询时,我们会在 LIMIT 后面传 ...

  2. VS2015--win32project配置的一些想法之在 Visual Studio 2015 中进行调试的同一时候分析性能...

    出处: https://msdn.microsoft.com/zh-cn/magazine/dn973013(en-us).aspx 很多开发商花了绝大多数时间获取应用程序才干正常发挥作用.更少的时间 ...

  3. sar命令,linux中最为全面的性能分析工具之一

    sar是System Activity Reporter(系统活动情况报告)的缩写.这个工具所需要的负载很小,也是目前linux中最为全面的性能分析工具之一.此款工具将对系统当前的状态就行取样,然后通 ...

  4. matlab中dcsk,【网安学术】煤矿井下MIMO-CD-FM-DCSK通信性能的分析

    原标题:[网安学术]煤矿井下MIMO-CD-FM-DCSK通信性能的分析 摘要:针对煤矿井下无线通信环境的复杂性和特殊性,将MIMO技术与CD-FM-DCSK混沌键控通信系统相结合进行可行性研究.以2 ...

  5. vin-slam中调用ceres库内部代码分析与性能优化

    vin-slam中调用ceres库内部代码分析与性能优化 1,vin-slam中后端参数优化调用流程代码 2,ceres内部的求解流程(未完待续) 首先,很抱歉前几次上传的关于一些图像算法代码不全,主 ...

  6. curl php 传递meta标签内容,php中get_meta_tags()、CURL与user-agent用法分析

    本文实例分析了php中get_meta_tags().CURL与user-agent用法..具体分析如下: get_meta_tags()函数用于抓取网页中形式的标签,并装入一维数组,name为元素下 ...

  7. 性能优化分析(更新中)

    更新日志,分多次更新 2021-10-24 第一个版本 应用层systemtrace tag,systemtrace分析,LayerType离屏缓存相关内容 更新traceView 更新常见内存泄漏, ...

  8. php中file_get_contents如何读取大容量文件

    php中file_get_contents如何读取大容量文件 一.总结 一句话总结:使用file_get_contents()进行分段读取,file_get_contents()函数可以分段读取 1. ...

  9. linux监测cpu 内存,Linux中CPU与内存性能监测.docx

    Linux中CPU与内存性能监测(出处://chenleixing/article/details 在系统维护的过程中,随时可能有需要查看 CPU 使用率内存使用情况的需要,尤其是涉及到JVM,程序调 ...

  10. [转帖]ASP.NET中常用的优化性能的方法

    ASP.NET中常用的优化性能的方法(转贴,Icyer收集整理) 1.       数据库访问性能优化     数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要 ...

最新文章

  1. Oracle去除表中重复记录
  2. HierarchicalDataTemplate
  3. qt获取开发板ip地址_qt获取网络ip地址的类
  4. docker重启mysql数据丢失_mysql如何确保数据不丢失的?我们借鉴这种设计思想实现热点账户高并发
  5. AcWing 523. 组合数问题
  6. mysql 建表报错_mysql innodb 引擎 ,建表时报错:ERROR 1118 (42000)
  7. DOS下常用命令大集合
  8. 如何从低端面畜到高端面霸
  9. POJ4001 HDU4121 UVA1589 UVALive5829 Xiangqi【模拟+回溯】
  10. matlab画图命令
  11. FreeCAD快速开始
  12. 多媒体计算机与一般计算机,计算机和多媒体计算机的区别
  13. linux 多线程 压缩,24、Linux 多线程压缩工具pigz 的学习
  14. 人工在线客服不在线怎么办
  15. leetcode495. 提莫攻击
  16. Stapler#攻略
  17. 良精商城网店购物系统
  18. LightOJ 1079 Just another Robbery (概率dp+背包)
  19. python用requests爬取png图片并保存到本地
  20. R12现金管理系统:银行对账单(Bank Statement)的标准处理流程

热门文章

  1. 通过jquery读cookie添加xsrf HTTP头来避免请求伪造
  2. 互联网+制造业,让你的生产管理更容易
  3. 检测点云中的目标(ROS2 Tao-PointPillars)
  4. Windows10远程桌面登录——Teamviewer
  5. 开源夺宝抽奖一元系统,java+uniapp开发
  6. 卡西欧计算机开机键,卡西欧手表怎么开机
  7. 关于WIN10开机自动开启小键盘解决方案
  8. 嵌入式(文件)数据库与数据库服务器的区别
  9. 基于MATLAB的R方计算
  10. 移动端框架之mand-mobile