gpt4 book ai didi

php - php socket I/O 函数的区别

转载 作者:行者123 更新时间:2023-12-03 11:56:31 24 4
gpt4 key购买 nike

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

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

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

感谢您查看我的问题,如果您有任何建议,我将不胜感激~

最佳答案

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

我认为在这种情况下要记住的重要一点是,在套接字上运行的一些函数是通用的,而另一些则更具体。 PHP streams API 试图提供一种通用文件/网络操作的方法,因此为常见操作提供通用函数,例如 fwritefread .这就是为什么你可以 fopen网页、本地文件或压缩文件都具有相同的功能。然而 stream_socket_*()函数族更具体,并提供仅与套接字相关的额外功能。例如,stream_socket_recvfrom()stream_socket_sendto()调用允许带外数据 channel (本质上是一种使用单个连接多路复用另一个数据流的方法)。

我将尝试比较/对比一些适用于套接字的通用和特定 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 连接中的 channel (发送或接收)。例如,您可以在全双工套接字上停止发送,但仍继续阅读。

  • 注意:下一个比较实际上并不是通用的流函数和特定于套接字的函数之间的比较。这是对碰巧做不同事情的两个通用流函数的比较。我把它包括在内,因为你在问题中提到了它。
  • fread()对比 stream_get_contents() : fread最多读取预定数量的字节; stream_get_contents读取流上的剩余数据。您可以看到这几乎是一个可以提高性能的便捷功能。但是有时您需要使用 fread 流式传输数据。例如,当您期望大量数据无法放入主内存时。

  • 希望你明白这一点。其中很多与低级编程接口(interface)的结构相似。例如,在 Linux 中,用于处理 I/O 设备的接口(interface)是多态的。您可以 read()在文件、域套接字、流套接字、数据报套接字、管道、fifo、ETC 上。然而,有一些函数专门用于特定类型的 I/O 设备(例如 send() 仅在套接字上调用)。

    我会建议选择最适合您需求的东西,而不是让自己倾向于任何关于使用什么的一般规则。例如,如果您需要 GET通过 HTTP 的网页,只需使用 file_get_contents .如果您知道响应将是巨大的,您可能想要 fopen它并将结果流式传输到磁盘。如果您需要为自定义协议(protocol)实现客户端,那么我将使用更具体的流套接字系列函数,为您提供更精细的控制。

    关于php - php socket I/O 函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45384945/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com