× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

onClose

TCP客户端连接关闭后,在worker进程中回调此函数。函数原型:

function onClose(swoole_server $server, int $fd, int $reactorId);
  • $serverServer对象
  • $fd:连接的文件描述符
  • $reactorId 来自那个reactor线程,主动close关闭时为负数
onClose 回调函数如果发生了致命错误,会导致连接泄漏。通过 netstat 命令会看到大量 CLOSE_WAIT 状态的 TCP 连接

无论由客户端发起close还是服务器端主动调用$serv->close()关闭连接,都会触发此事件。因此只要连接关闭,就一定会回调此函数
onClose中依然可以调用getClientInfo方法获取到连接信息,在onClose回调函数执行完毕后才会调用close关闭TCP连接

注意:这里回调onClose时表示客户端连接已经关闭,所以无需执行$server->close($fd)。代码中执行$serv->close($fd)会抛出PHP错误告警。

主动关闭

当服务器主动关闭连接时,底层会设置此参数为-1,可以通过判断$reactorId < 0来分辨关闭是由服务器端还是客户端发起的。

只有在PHP代码中主动调用close方法被视为主动关闭

心跳检测

心跳检测是由心跳检测线程通知关闭的, 关闭时onClose的$reactorId参数不为-1


  • lovejocky

    Websocket中,怎么感觉发送close()请求后,服务端要延迟个1秒左右才能响应啊?

  • 张宇

    java多线程链接后,再断开,onClose() 经常响应不全, 比如 60个链接,同时断开,只会收到50多个onClose()回调。 这个是什么原因呢 ?

  • 张宇

    每次基本都能重现这个问题。还有的时候,60个链接同时断开,会收到45个onClose()回调,然后隔10秒左右,又收到10个左右的onClose()回调,最后还会有好几个没有收到回调。 这个问题困扰很久了。谁能帮忙看看。

  • 四季

    对于同一个worker,swoole是严格按照:onConnect, onReceive(可能有多个), onClose 的调用顺序来的吗? 现在我遇到一个问题:程序在调用了onClose并释放资源之后,又开始Receive数据处理时报错了。 下面是日志,真是奇了怪了: INFO - 2017-02-11 14:44:20.4731 - onConnect, worker_pid:28873 INFO - 2017-02-11 14:44:20.4785 - onReceive, worker_pid:28873:data string

    在这里关闭了连接

    INFO - 2017-02-11 14:44:20.4901 - onClose, worker_pid:28873

    这里没有经过onConnect又开始接收数据

    INFO - 2017-02-11 14:44:20.4910 - onReceive, worker_pid:28873:data string

  • Early

    PHP onClose() 在类中怎么调用呢?各位大侠

  • 包赢不输

    在cli下面,执行ctrl+c 不会调用到onclose回调啊,应该怎样执行资源回收呢?

  • The_Unicorn

    onclose能拿到最后一次连接的包吗?能在onclose里进行业务逻辑操作吗?还是智能echo、var_dump

  • dawn

    onClose是在断开连接后回调,请问大佬有在断开连接前即将断开连接的时候的回调吗,不然都不知道是谁断开连接了