在之前的版本中,多端口监听的心跳检测性能只能配置在主服务上,无奈为每个端口独自设置心跳工夫。
例如须要在 9501
端口上设置 30
秒,而 9502
端口上设置 60
秒。从 v4.7
版本开始进行了反对,上面来具体理解一下。
配置项
在 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
秒之后断开。
这样的输入后果合乎所配置的心跳检测配置,须要应用该性能的用户能够进行降级体验。