socket_close

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_close关闭 Socket 实例

说明

socket_close(Socket $socket): void

socket_close() 关闭由 socket 给出的 Socket 实例。

参数

socket

使用 socket_create()socket_accept() 创建的 Socket 实例。

返回值

没有返回值。

变更日志

版本 说明
8.0.0 socket 现在是 Socket 实例;以前是 resource

参见

添加注释

用户贡献的注释 3 个注释

yaBliznyk at gmail dot com
7 年前
/* 任何代码 */
$linger = array ('l_linger' => 0, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);
socket_close($sock);

这是强制关闭套接字连接的代码。
aeolianmeson at NOSPAM dot blitzeclipse dot com
18 年前
PHP: 5.1.4
摘要:close() 不会立即释放套接字。

使用 BSD 套接字实现(这是 PHP 使用的套接字接口),socket_close() 可能会关闭套接字,但可能仍有数据要发送。在发送数据之前,端口将不可用。因此,对该端口尝试的所有进一步绑定都将不可接受,因为会产生“端口无法重用”(无论如何是近似消息)错误。通常,如果设置了 REUSABLE 套接字选项,唯一会引发此错误的是绑定到已经绑定的特定 IP/端口组合。

为了避免此问题,您必须告诉它延迟返回,直到端口发送完剩余数据或在发送数据时超时。这是通过 SO_LINGER 选项完成的。要设置此选项,它需要一个包含两个元素的数组:第一个指示在关闭完成之前是否需要对任何数据进行延迟,第二个指示我们是否实际延迟。如果我们在将零设置为第二个时将非零设置为第一个,我们将只丢弃缓冲区中等待的任何数据,并关闭套接字。要告诉它只是等待数据发送,您发送两个非零:array(1, 1)。

请注意,如果您已指示不阻塞(socket_set_nonblock()),它将简单地退出,无论如何,就像它通常会做的那样。在这种情况下,它会突发 EWOULDWAIT 标志,但由于我认为我们无法在 PHP 中访问这些套接字标志,因此应该在设置延迟并退出之前重新启用阻塞。

// 这些命令直接馈送到 Unix 套接字库中.. 这就是它们更像 C 的原因。
$arrOpt = array('l_onoff' => 1, 'l_linger' => 1);
socket_set_block($this->Socket);
socket_set_option($this->Socket, SOL_SOCKET, SO_LINGER, $arrOpt);
socket_close($this->Socket);
chaos
22 年前
有时似乎您必须在关闭() 套接字之前先 shutdown() 它。我在使用这个很棒的套接字扩展在 PHP 中制作聊天服务器时遇到了这个问题。
To Top