长话短说,php中有如此多的套接字I / O函数似乎在做同样的事情。
所以我想知道fread()
和stream_get_contents()
以及stream_socket_recvfrom()
之间有什么区别吗?
同样fwrite()
和stream_socket_sendto()
,它们看起来都一样,我应该选择哪个?
感谢您查看我的问题,我将不胜感激任何建议〜
答案 0 :(得分:4)
不幸的是,不一致和冗余似乎是PHP的标志:你确实有很多选择。简而言之,简直令人困惑。
我认为在这种情况下要记住的重要一点是,在套接字上运行的某些函数是泛型,而其他函数则是特定的。 PHP streams API尝试提供一种概括文件/网络操作的方法,因此为fwrite
和fread
等常见操作提供通用函数。这就是为什么你可以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
并将结果传输到磁盘。如果您需要为自定义协议实现客户端,那么我将使用更具体的流套接字系列函数,为您提供更精细的控制。