php socket I / O函数之间的区别

时间:2017-07-29 03:29:31

标签: php sockets

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

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

同样fwrite()stream_socket_sendto(),它们看起来都一样,我应该选择哪个?

感谢您查看我的问题,我将不胜感激任何建议〜

1 个答案:

答案 0 :(得分:4)

不幸的是,不一致和冗余似乎是PHP的标志:你确实有很多选择。简而言之,简直令人困惑。

我认为在这种情况下要记住的重要一点是,在套接字上运行的某些函数是泛型,而其他函数则是特定的PHP streams 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设备的接口是多态的。您可以在文件,域套接字,流套接字,数据报套接字,管道,fifo,ETC上read()。但是,有一些功能可以专门在某种类型的I / O设备上运行(例如send()仅在套接字上调用)。

我建议您选择最适合您需求的内容,而不是让您自己遵守有关使用内容的任何一般规则。例如,如果您需要通过HTTP GET网页,请使用file_get_contents。如果您知道响应将会很大,您可能需要fopen并将结果传输到磁盘。如果您需要为自定义协议实现客户端,那么我将使用更具体的流套接字系列函数,为您提供更精细的控制。