PHP fopen/file_get_contents与curl性能比较

PHP fopen/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";

?>

  

file_get_contents 速度:4.2404510975 seconds

curl 速度:2.8205530643 seconds

curl 比 file_get_contents 速度快了 30% 左右,最重要的是服务器负载更低.

  

总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112204.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 世界一级行政区划图_世界行政区划图册

    世界一级行政区划图_世界行政区划图册序号 国家 省 城市 8168 波兰 下西里西亚省   8169 波兰 下西里西亚省 下布热格 8170 波兰 下西里西亚省 佩希采 8171 波兰 下西里西亚省 克沃兹科 8172 波兰 下西里西亚省 兹戈热莱茨 8173 波兰 下西里西亚省 兹沃托雷亚 8174 波兰 下西里西亚省 博莱斯瓦维茨 8175 波兰 下西里

    2022年9月29日
    4
  • pycharm定义函数无法运行_把一个命令按钮设置成无效

    pycharm定义函数无法运行_把一个命令按钮设置成无效Pycharm命令行Terminal命令无效欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与…

    2022年8月25日
    7
  • 实战篇:Linux7 安装 Oracle 19C RAC 详细图文教程

    实战篇:Linux7 安装 Oracle 19C RAC 详细图文教程趁着周末边做边写,来一篇19CRAC手把手教程!

    2022年6月27日
    29
  • swoole 建立httpserver 服务[通俗易懂]

    swoole 建立httpserver 服务

    2022年2月12日
    38
  • JAVABEAN是什么和总结JAVABEAN的两种使用方式

    JAVABEAN是什么和总结JAVABEAN的两种使用方式原文:http://www.blogjava.net/flysky19/articles/88180.html一、 javabean 是什么?Javabean 就是一个类,这个类就定义一系列 get 和 set 方法。 Sosimple !Javabean 就是为了和 jsp 页面传数据化简交互过程而产生的。自己的理解:使用 javabean 和不用 javabean 的

    2022年7月17日
    14
  • 模型矩阵、视图矩阵、投影矩阵

    模型矩阵、视图矩阵、投影矩阵模型视图投影矩阵的作用,就是将顶点从局部坐标系转化到规范立方体(CanonicalViewVolnme)中。总而言之,模型视图投影矩阵=投影矩阵×视图矩阵×模型矩阵,模型矩阵将顶点从局部坐标系转化到世界坐标系中,视图矩阵将顶点从世界坐标系转化到视图坐标系下,而投影矩阵将顶点从视图坐标系转化到规范立方体中。如下图所示,假设现在要将三维空间中的三角形渲染到屏幕上。三角形的模型文件中,顶点坐标是…

    2022年5月14日
    78

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号