在之前的版本中,多端口监听的心跳检测性能只能配置在主服务上,无奈为每个端口独自设置心跳工夫。

例如须要在9501端口上设置 30 秒,而9502端口上设置 60 秒。从v4.7版本开始进行了反对,上面来具体理解一下。

配置项

Server 中提供了两个配置项:heartbeat_check_intervalheartbeat_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 9501telnet 127.0.0.1 9502telnet 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.

连贯 123 都是在 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.
  • 连贯 11 秒之后断开;
  • 连贯 22 秒之后断开;
  • 连贯 310 秒之后断开。

这样的输入后果合乎所配置的心跳检测配置,须要应用该性能的用户能够进行降级体验。