长话短说,php中有太多的套接字I/O函数似乎在做同样的事情。所以我想知道fread()和stream_get_contents()和stream_socket_recvfrom()之间有什么区别吗?还有fwrite()和stream_socket_sendto(),它们看起来都一样,我应该选择哪个?谢谢你看我的问题,如果有什么意见我会很感激的~
fread()
stream_get_contents()
stream_socket_recvfrom()
fwrite()
stream_socket_sendto()
ffscu2ro1#
不幸的是,不一致和冗余似乎是PHP的标志:你确实有很多选择,坦率地说,流是很容易混淆的。我认为在这种情况下需要记住的是,一些在套接字上操作的函数是“通用的”,而另一些则是"特定的“。PHP streams API试图提供一种通用文件/网络操作的方法,因此为fwrite和fread等常见操作提供了通用函数。这就是为什么您可以fopen一个Web页面,本地文件或压缩存档都具有相同的函数。但是,stream_socket_*()系列函数更具体,并提供仅适用于套接字的额外功能。例如,stream_socket_recvfrom()和stream_socket_sendto()调用允许带外数据通道(本质上是使用单个连接多路复用另一个数据流的方法)。我将尝试比较/对比一些通用和特定的PHP函数,因为它们适用于套接字。
fwrite
fread
fopen
stream_socket_*()
fopen()
stream_socket_client()
fread()/fwrite()
stream_socket_sendto()/stream_socket_recvfrom()
fclose()
stream_socket_shutdown()
fclose
stream_socket_shutdown
注意:下一个比较并不是一个通用的流函数和一个套接字特定的函数之间的比较,而是两个做不同事情的通用流函数之间的比较,因为你在问题中提到了它,所以我把它包括进来了。
stream_get_contents
希望你能理解这个想法。这与低级编程接口的结构有很大的相似之处。例如,在Linux中,用于处理I/O设备的接口是多态的。你可以在文件、域套接字、流套接字、数据报套接字、管道、fifo然而,存在用于专门在特定类型的I/O设备上操作的函数(例如,仅在套接字上调用send())。我建议选择最适合您需要的,不要让自己倾向于任何关于使用什么的一般规则。例如,如果您需要通过HTTP对Web页面进行GET,只要使用file_get_contents,如果你知道响应会很大,你可能会想fopen它和流的结果到磁盘。如果您需要为自定义协议实现客户端,那么我会使用更具体的流套接字函数族,它可以为您提供更精细的控制。
send()
GET
file_get_contents
1条答案
按热度按时间ffscu2ro1#
不幸的是,不一致和冗余似乎是PHP的标志:你确实有很多选择,坦率地说,流是很容易混淆的。
我认为在这种情况下需要记住的是,一些在套接字上操作的函数是“通用的”,而另一些则是"特定的“。PHP streams API试图提供一种通用文件/网络操作的方法,因此为
fwrite
和fread
等常见操作提供了通用函数。这就是为什么您可以fopen
一个Web页面,本地文件或压缩存档都具有相同的函数。但是,stream_socket_*()
系列函数更具体,并提供仅适用于套接字的额外功能。例如,stream_socket_recvfrom()
和stream_socket_sendto()
调用允许带外数据通道(本质上是使用单个连接多路复用另一个数据流的方法)。我将尝试比较/对比一些通用和特定的PHP函数,因为它们适用于套接字。
fopen()
与stream_socket_client()
:例如,你可以fopen
一个TCP连接,但是假设你想获得更多关于连接状态的信息或者处理超时。stream_socket_client()
函数允许你设置连接超时状态,并且在连接不成功时获得更高级的错误反馈。它还允许你异步连接(即在非阻塞模式下)。fread()/fwrite()
与stream_socket_sendto()/stream_socket_recvfrom()
:如前所述,您可以使用后面的函数集接收/发送带外数据;您还可以将连接和读/写操作封装到单个调用中。fclose()
与stream_socket_shutdown()
:它们并不完全相似,但名称暗示了一些相似之处。您仍然需要调用fclose
来释放套接字和任何关联的内存。stream_socket_shutdown
的功能是关闭底层TCP连接中的通道(发送或接收)。例如,您可以停止全双工套接字上的发送,但仍然继续阅读。注意:下一个比较并不是一个通用的流函数和一个套接字特定的函数之间的比较,而是两个做不同事情的通用流函数之间的比较,因为你在问题中提到了它,所以我把它包括进来了。
fread()
与stream_get_contents()
:fread
读取最多预定数量的字节;stream_get_contents
读取流中的剩余数据。您可以看到,这是一个非常方便的函数,可以提高性能。但是,有时您需要使用fread
流式传输数据,例如,当您预计有大量数据无法放入主内存时。希望你能理解这个想法。这与低级编程接口的结构有很大的相似之处。例如,在Linux中,用于处理I/O设备的接口是多态的。你可以在文件、域套接字、流套接字、数据报套接字、管道、fifo然而,存在用于专门在特定类型的I/O设备上操作的函数(例如,仅在套接字上调用
send()
)。我建议选择最适合您需要的,不要让自己倾向于任何关于使用什么的一般规则。例如,如果您需要通过HTTP对Web页面进行
GET
,只要使用file_get_contents
,如果你知道响应会很大,你可能会想fopen
它和流的结果到磁盘。如果您需要为自定义协议实现客户端,那么我会使用更具体的流套接字函数族,它可以为您提供更精细的控制。