• fsockopen/curl/file_get_contents效率比较

    使用上的一些比较
    服务器君一共花费 165.596 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    前面小节 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 也很强大,但是比较偏底层。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android与SQLite数据库 7 个条目
  2. [运维管理] 防火墙原理与应用 5 个条目
  3. [Python程序设计] 标准库:urllib/urllib2 14 个条目
  4. [移动开发] Android抽屉导航NavigationDrawer 5 个条目
  5. [移动开发] 从代码角度去认识HttpClient 2 个条目
  6. [Python程序设计] Django Web环境配置 2 个条目
  7. [软件工程与项目管理] 浏览器的CSS解析 7 个条目
  8. [Python程序设计] Django与表单 4 个条目
  9. [PHP程序设计] PHP里的引用 5 个条目
  10. [Linux操作系统] CentOS上使用EPEL Repository 2 个条目
  11. [数据结构] 图的定义 1 个条目
  12. [Python程序设计] Python Web部署的背景知识 9 个条目
窗口 -- [协会]