PHP如何正常closures本地套接字连接…?

我有一个PHP客户端通过纯文本的Unix域套接字连接到本地C服务器程序。 但是,我可以很好地closures它的唯一方法是如果我完成套接字会话:

stream_socket_shutdown($sock, 1); // shutdown socket writing usleep(500 * 1000); // wait for 0.5 seconds fclose($sock); // actually close the socket (finally) 

我想像我的C客户端那样优雅地closures它:

 shutdown(connection_fd, SHUT_WR); // tell server we've stopped sending queries // Read from the socket until poll(connection_fd) yields POLLRDHUP / POLLHUP / POLLERR / POLLNVAL shutdown(connection_fd, SHUT_RDWR); // tell connection we've stopped listening close(connection_fd); // close the whole connection (finally) 

但是,PHP似乎没有直接的套接字poll()等效。 我怎样才能让PHP优雅地closures我的本地套接字?

你有没有尝试过stream_set_blocking() ? 如果将流设置为非阻塞,则在关闭连接之前应能够使用所有未决数据:

 socket_shutdown($sock, STREAM_SHUT_WR); stream_set_blocking($sock, 0); while( fgets($sock) !== false ) { ; } fclose($sock); 

编辑:使用常量,并修正set-blocking命令使用正确的值。

说明:通过将流设置为非阻塞状态,然后读取所有内容,我们将使用输入缓冲区中的所有数据。 这大大加快了关机过程,通过发信号通知对方我们的缓冲区是清楚的,他可以给我们发送更多的消息(如FIN数据包)。

它仍然有可能得到一个缓慢的关机,但不太可能。