/* 任何代码 */
$linger = array ('l_linger' => 0, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);
socket_close($sock);
这是强制关闭套接字连接的代码。
没有返回值。
/* 任何代码 */
$linger = array ('l_linger' => 0, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);
socket_close($sock);
这是强制关闭套接字连接的代码。
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);