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
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