stream_socket_shutdown

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

stream_socket_shutdown关闭全双工连接

描述

stream_socket_shutdown(resource $stream, int $mode): bool

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

注意:

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

参数

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 个笔记

5
Daniel J
3 年前
小心使用 stream_socket_shutdown 和 TLS 套接字。套接字在不发送 TLS 协议所需的“close_notify”消息的情况下关闭。

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

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

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