PHP Conference Japan 2024

stream_socket_shutdown

(PHP 5 >= 5.2.1, PHP 7, PHP 8)

stream_socket_shutdown关闭全双工连接

描述

stream_socket_shutdown(资源 $stream, 整数 $mode): 布尔值

(部分或全部)关闭全双工连接。

注意:

关联的缓冲区可能被清空,也可能不被清空。

参数

stream

一个打开的流(例如,使用 stream_socket_client() 打开)

mode

以下常量之一:STREAM_SHUT_RD(禁用进一步接收)、STREAM_SHUT_WR(禁用进一步发送)或STREAM_SHUT_RDWR(禁用进一步接收和发送)。

返回值

成功返回 true,失败返回 false

示例

示例 #1 一个 stream_socket_shutdown() 示例

<?php

$server
= stream_socket_server('tcp://127.0.0.1:1337');
$client = stream_socket_client('tcp://127.0.0.1:1337');

var_dump(fputs($client, "hello"));

stream_socket_shutdown($client, STREAM_SHUT_WR);
var_dump(fputs($client, "hello")); // 现在不起作用了

?>

以上示例将输出类似以下内容

int(5)

Notice: fputs(): send of 5 bytes failed with errno=32 Broken pipe in test.php on line 9
int(0)

参见

  • fclose() - 关闭打开的文件指针

添加注释

用户贡献的注释 3 条注释

Daniel J
3 年前
请注意使用 stream_socket_shutdown 与 TLS 套接字。套接字在未发送 TLS 协议所需的“close_notify”消息的情况下关闭。

要正确关闭 TLS 套接字,请改用 fclose(),它会在内部调用 OpenSSL 的 SSL_shutdown() 函数。
匿名
3 年前
正如 Daniel J 指出的那样,stream_socket_shutdown 不会发送 TLS close_notify 消息。在某些情况下,它比 fclose 更受欢迎(例如,触发 stream_select)。

要在 TLS 中正确使用此函数,请在关闭套接字之前使用 stream_socket_enable_crypto($fp, false);。
jgotti
12 年前
只是要说明一点,如果您在多客户端服务器中使用 fclose 关闭某些套接字时遇到问题,您应该真正尝试一下这个。

花了一整天的时间试图使用 stream_socket_shutdown($clientStream,STREAM_SHUT_RDWR); 解决这个问题。
最终解决了问题。
To Top