请问php中三种http请求方式有什么区别呢(cURL,stream,socket)

谷歌查询到的资料都比较模糊,能不能从业务以及技术的角度比较这三种方式有什么异同点呢?最好可以结合guzzle代码分析

阅读 2k
1 个回答

socket 就是最底层的 Socket 通信, 如果要访问 HTTP, 你得完全手写, 这是非常底层的方式, 除非你有特殊需要, 不然不建议这么做. 所以这个可以先排除在外.

curl 实际上是一个命令行界面的网络工具, 然后 libcurl 则是一个为 C 编写的网络访问库, 它并不仅仅支持 HTTP, 还支持 FTP, Gopher, POP3, IMAP, SMTP 等非常多的协议. 因为它非常成熟实用, 所以很早就被用 PHP 扩展的方式兼容了起来, 当然这个扩展需要依赖 libcurl 的代码, 也可以认为是当下 PHP 最主流的访问 HTTP 的方式

PHP 的 stream 的 HTTP 上下文是为 PHP 内建的标准 I/O 接口准备的, 通过 stream 的 HTTP 上下文你可以用 fopen, fread, fwrite 或者 streamWrapper 这类直接操作本地文件 I/O 的函数和类来实现统一访问

从性能和内存足迹的层面来说, 我记得 curl 是最好的, 你可以自己实际测试一下.

有一个很有意思的情况是, PHP 的 curl 扩展也提供了 curl 的上下文, 也就是说, 可以用 curl 封装掉 PHP 的 Stream 访问的 HTTP 上下文 的实现, 在这种情况下, 虽然你走的是 Stream, 但底层实际上调用的还是 curl, 详见: https://www.php.net/manual/zh/context.curl.php

注: 这里提到的上下文 Context 是 PHP Stream 流内的一个概念, 用以指具体的数据流(不管是网络还是本地I/O)的协议: https://www.php.net/manual/zh/context.php

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题