fsockopen/curl/file_get_contents效率比较[通俗易懂]

fsockopen/curl/file_get_contents效率比较

大家好,又见面了,我是全栈君。

前面小节 PHP抓取网络数据的6种常见方法 谈到了 fsockopen,curl与file_get_contents 的使用方法,虽然它们都能达到同一个使用目的,但是它们之间又有什么区别呢?

先谈谈curl与fsockopen。

fsockopen 是比较底层的调用,属于网络系统的socket调用,而curl经过的包装支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证,HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。fsockopen 返回的是没有处理过的数据,包括数据的长度数据内容和数据的结束符。而curl是处理后的内容。

在用户使用时,curl 更加方便,但其参数很多,配置稍微复杂,fsockopen 则有固定的几个参数,简单,但获取结果可能需要再做处理。

那么file_get_contents呢?

有些时候用 file_get_contents() 调用外部文件容易超时报错。curl 效率比 file_get_contents() 和 fsockopen() 高一些,原因是CURL会自动对DNS信息进行缓存。

file_get_contents / curl / fsockopen 在当前所请求环境下选择性操作,没有一概而论。

file_get_contents 需要php.ini里开启allow_url_fopen,请求http时,使用的是http_fopen_wrapper,不会keeplive的话curl是可以的。 file_get_contents()单个执行效率高,返回没有头的信息。 

这个是读取一般文件的时候并没有什么问题,但是在读取远程问题的时候有可能就会出现问题。 如果是要打一个持续连接,多次请求多个页面。那么file_get_contents和fopen就会出问题。 取得的内容也可能会不对。所以做一些类似采集工作的时候,肯定就有问题了。 

fsockopen 较底层,可以设置基于UDP或是TCP协议去交互,配置麻烦,不易操作。 返回完整信息。 

总之,file_get_contents 和 curl 能干的,socket都能干。socket能干的,curl 就不一定能干了 。file_get_contents 更多的时候只是去拉取数据。效率比较高也比较简单。 

只讨论 curl 与file_get_contents 的话,有这么一些结论:

  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方式获取数据。

PS:file_get_contents()函数获取https链接内容的时候,需要php 中mod_ssl的支持(或安装opensll)。

结论就是,curl 效率及稳定都比 file_get_contents() 要好,fsockopen 也很强大,但是比较偏底层。

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

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

(0)
上一篇 2022年2月10日 上午8:00
下一篇 2022年2月10日 上午8:00


相关推荐

  • 理解 Thread.Sleep 函数 ,Sleep(0) 释放当前线程所剩余的时间片,让线程马上回到就绪队列而非等待队列…

    理解 Thread.Sleep 函数 ,Sleep(0) 释放当前线程所剩余的时间片,让线程马上回到就绪队列而非等待队列…

    2021年9月11日
    76
  • 校验非空的注解@NotNull怎么取得自定义的message[通俗易懂]

    校验非空的注解@NotNull怎么取得自定义的message[通俗易懂]由于项目表单需要校验字段过多,一个一个去判空太麻烦,所以用了@NotNull注解,字段非空会抛出MethodArgumentNotValidException异常。接下来要取得@NotNull(message=“自定义异常”)里的message内容给前端显示直接贴上代码:publicStringgetMessage(MethodArgumentNotValidExceptionexc…

    2022年5月18日
    70
  • java内部类和静态内部类区别_静态内部类对象的创建

    java内部类和静态内部类区别_静态内部类对象的创建在阅读JavaCollectionFramwork时,LinkedList中有个静态内部类:privatestaticclassNode<E>{Eitem;Node<E>next;Node<E>prev;Node(Node<E>prev,Eelem…

    2022年10月11日
    4
  • 剑指Offer——Trie树(字典树)

    剑指Offer——Trie树(字典树)剑指Offer——Trie树(字典树)Trie树Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

    2025年9月6日
    6
  • pycharm2019.3.3激活教程_pycharm2020.2激活码

    pycharm2019.3.3激活教程_pycharm2020.2激活码下载官网下载2019.03最新版http://www.jetbrains.com/pycharm/download/download-thanks.html?platform=windows安装一路点击下一步,安装目录建议放在非C盘位置激活方式1:激活码第一次打开时,激活方式选择激活码。复制粘贴下面一整行,点击激活即可。有效期是2019年11月份,到时候会更新新的激活码。这种方式…

    2022年8月25日
    8
  • 追源码的平凡之路[通俗易懂]

    追源码的平凡之路[通俗易懂]此文转载自:https://my.oschina.net/makemyownlife/blog/4692463大咖揭秘Java人都栽在了哪?点击免费领取《大厂面试清单》,攻克面试难关~>>>在斯坦福大学,乔布斯做了一场我认为他最精彩的演讲之一(另一场可能是iphone的问世发布会)。他讲了第一个故事”connectingthedots”你不可能充满预…

    2022年5月28日
    36

发表回复

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

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