php套接字I / O功能之间的区别

Not*_*123 1 php sockets

长话短说,php中有太多的套接字I / O函数似乎在做同样的事情。

所以我想知道fread()stream_get_contents()和之间有什么区别stream_socket_recvfrom()吗?

此外fwrite()stream_socket_sendto(),他们都长得一样,应该选择我?

感谢您查看我的问题,我将为您提供任何建议〜

Rog*_*Gee 5

不幸的是,不一致和冗余似乎是PHP的标志:您确实有很多选择。坦率地说,流简直令人困惑。

我认为在这种情况下要记住的重要一点是,某些在套接字上运行的功能是通用的,而其他功能则更为具体。的PHP流 API尝试来提供一种方式来概括文件/网络操作,因此对于诸如常见的操作提供了通用的功能fwritefread。因此,您可以fopen使用相同的功能来浏览网页,本地文件或压缩档案。但是stream_socket_*(),功能系列更为具体,并提供仅与套接字相关的额外功能。例如,stream_socket_recvfrom()stream_socket_sendto()调用允许带外数据通道(本质上是一种使用单个连接多路复用另一个数据流的方法)。

我将尝试比较/对比一些适用于套接字的通用与特定PHP函数。

  • fopen()vs stream_socket_client()fopen例如,您可以建立TCP连接,但是假设您想获取有关连接状态或处理超时的更多信息。该stream_socket_client()功能允许您设置连接超时状态,并在连接失败时获得更高级的错误反馈。它还允许您异步连接(即以非阻塞模式)。

  • fread()/fwrite()vs stream_socket_sendto()/stream_socket_recvfrom():如前所述,您可以使用后面的一组功能来接收/发送带外数据;您还可以将连接和读/写操作封装到一个调用中。

  • fclose()vs stream_socket_shutdown():这些并不完全相似,但名称暗示相似。您仍然想调用fclose以释放套接字和任何相关的内存。的功能stream_socket_shutdown是关闭基础TCP连接中的通道(发送或接收)。例如,您可以停止在全双工套接字上发送,但仍保持读取状态。

注意:下一个比较实际上不是泛型流函数和特定于套接字的函数之间的比较。它是两个碰巧做不同事情的通用流函数的比较。因为您在问题中提到了它,所以我将其包括在内。

  • fread()vs stream_get_contents()fread读取预定的字节数;stream_get_contents读取流中的剩余数据。您可以看到这几乎是一个便利功能,可以提高性能。但是,有时您需要流式传输数据,fread例如,当您期望大量数据无法放入主存储器中时。

希望你能明白。其中很多与底层编程接口的结构相似。例如,在Linux中,用于I / O设备的接口是多态的。您可以read()在文件,域套接字,流套接字,数据报套接字,管道,fifo,ETC上。但是,有一些功能可以在某种类型的I / O设备上专门运行(例如send(),仅在套接字上调用)。

我建议您选择最适合您需求的产品,而不要使自己习惯于使用任何通用规则。例如,如果您需要GET通过HTTP访问网页,则只需使用file_get_contents。如果您知道响应将是巨大的,则可能需要响应fopen并将结果流式传输到磁盘。如果您需要为自定义协议实现客户端,那么我将使用更具体的流套接字函数系列,这些函数可为您提供更精细的控制。