配置项
在 Server
中提供了两个配置项:heartbeat_check_interval
和 heartbeat_idle_time
。
可以使用如下配置项增加心跳检测:
$server->set([ 'heartbeat_check_interval' => 60, 'heartbeat_idle_time' => 120, ]);
heartbeat_check_interval
表示每隔多久轮循一次,单位为秒。如 heartbeat_check_interval => 60
,表示每 60
秒遍历所有连接。
如果该连接在 120
秒内(heartbeat_idle_time
未设置时默认为 interval
的两倍),没有向服务器发送任何数据,此连接将被强制关闭。
heartbeat_idle_time
表示连接最大允许空闲的时间。
示例
这里提供了一个多端口监听的代码用于测试,分别为不同的端口设置心跳检测:
为了方便测试将心跳检测时间设置为 1 秒
use Swoole\Server; $server = new Server('127.0.0.1', 9501, SWOOLE_BASE); $server->set([ 'heartbeat_check_interval' => 1, 'heartbeat_idle_time' => 1, ]); $server->on('connect', function ($server, $fd) { $time = date('Y-m-d H:i:s'); echo "[{$time}] Client#{$fd}: Connect.\n"; }); $server->on('receive', function ($server, $fd, $reactorId, $data) { $server->send($fd, 'ok'); }); $server->on('close', function ($server, $fd) { $time = date('Y-m-d H:i:s'); echo "[{$time}] Client#{$fd}: Close.\n"; }); $port2 = $server->listen('127.0.0.1', 9502, SWOOLE_SOCK_TCP); $port2->set([ 'heartbeat_idle_time' => 2, ]); $port3 = $server->listen('127.0.0.1', 9503, SWOOLE_SOCK_TCP); $port3->set([ 'heartbeat_idle_time' => 10, ]); $server->start();
可以使用telnet
或者 Swoole 的 TCP
户端进行测试。
这里使用了telnet
进行测试,分别连接 3
个端口
telnet 127.0.0.1 9501 telnet 127.0.0.1 9502 telnet 127.0.0.1 9503
使用 v4.6
版本进行测试会输出:
[2021-07-05 10:06:44] Client#1: Connect. [2021-07-05 10:06:45] Client#2: Connect. [2021-07-05 10:06:46] Client#3: Connect. [2021-07-05 10:06:46] Client#1: Close. [2021-07-05 10:06:47] Client#2: Close. [2021-07-05 10:06:48] Client#3: Close.
连接 1
、2
、3
都是在 2
秒之后的断开的。
那么再使用最新的v4.7
版本进行测试:
[2021-07-05 10:02:50] Client#1: Connect. [2021-07-05 10:02:51] Client#2: Connect. [2021-07-05 10:02:51] Client#1: Close. [2021-07-05 10:02:52] Client#3: Connect. [2021-07-05 10:02:53] Client#2: Close. [2021-07-05 10:03:02] Client#3: Close.
- 连接
1
在1
秒之后断开; - 连接
2
在2
秒之后断开; - 连接
3
在10
秒之后断开。
这样的输出结果符合所配置的心跳检测配置,需要使用该功能的用户可以进行升级体验。