我们来总结一下Swoole内核中和连接关闭有关的各种标志位。
在swoole::Connection结构里面:
1 | struct Connection { |
其中,
close_actively代表服务器主动关闭了连接。
closing代表服务器将要调用onClose回调函数(但还未调用)。
closed代表服务器已经调用完了onClose回调函数。
close_queued代表关闭连接的事件已经在排队了,一旦服务器要发送给客户端的数据发送完了,就会关闭对应的连接。这个东西是挂在对应的socket的out_buffer上的chunk上面。
close_reset代表要暴力关闭连接,不会等待send_buffer的数据发送完之后关闭连接,所以这种关闭模式会产生RST分节。
peer_closed代表客户端主动关闭了连接。
protect用来设置客户端连接为保护状态,不被心跳线程切断。
close_notify心跳线程设置这个标志位,用来通知reactor线程关闭连接。
close_force当reactor线程从管道里面收到SW_SERVER_EVENT_CLOSE_FORCE类型的数据的时候,reactor线程会去设置这个标志位。
last_time代表这个连接最后一次收到数据的时间,单位是毫秒。
last_time_usec代表这个连接最后一次收到数据的时间,单位是微秒。
理解这些标志位,对于处理一些连接泄漏的问题,会非常的有帮助。一旦某个进程连接泄漏了,我们可以attach进这个进程里面,然后选一个泄漏的Connection,看看这些标志位哪些是不正常的,就可以大概找到泄漏的原因。