php - PHP 如何优雅地关闭本地套接字连接...?

标签 php linux sockets polling unix-socket

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

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

我想像我的 C 客户端一样优雅地关闭它:-

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 优雅地关闭我的本地套接字?

最佳答案

你试过了吗 stream_set_blocking() ?如果您将流设置为非阻塞的,您应该能够在关闭连接之前使用所有待处理的数据:

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

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

说明: 通过将流设置为非阻塞,然后从中读取所有内容,我们消耗了输入缓冲区中已有的所有数据。通过向对等方发出我们的缓冲区已清除并且他可以向我们发送更多消息(如 FIN 数据包)的信号,这大大加快了关闭过程。

缓慢关机仍有可能,但可能性要小得多。

关于php - PHP 如何优雅地关闭本地套接字连接...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13295067/

相关文章:

php - 如何根据键删除数组元素?

php - 根据 id 与条件匹配更新一个 MySQL 表值

用于执行多个准备好的查询更新的 PHP 代码在第二次迭代时失败并出现重复键错误

linux - 如何调试本地主机 - 无法访问该站点

c++ - Winsock:监听和接收(差异)

c - 使用代码块进行套接字编程

php - 如何从php中的字符串生成数组集

linux - 使用 "find … -delete"仅从特殊子目录中删除图像文件

linux - 恢复 checkout 后所做的更改

c++ - 在套接字编程中选择数据包路径?