首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
Swoole v4.7 版本新特性预览之支持为每个端口设置不同的心跳检测时间
在之前的版本中,多端口监听的心跳检测功能只能配置在主服务上,无法为每个端口单独设置心跳时间。 例如需要在`9501`端口上设置 `30` 秒,而`9502`端口上设置 `60` 秒。从`v4.7`版本开始进行了支持,下面来详细了解一下。 ## 配置项 在 `Server` 中提供了两个配置项:`heartbeat_check_interval` 和 `heartbeat_idle_time`。 可以使用如下配置项增加心跳检测: ```php $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 秒 ```php 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` 个端口 ```bash telnet 127.0.0.1 9501 telnet 127.0.0.1 9502 telnet 127.0.0.1 9503 ``` 使用 `v4.6` 版本进行测试会输出: ```bash [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`版本进行测试: ```bash [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` 秒之后断开。 这样的输出结果符合所配置的心跳检测配置,需要使用该功能的用户可以进行升级体验。 ![](https://cdn.jsdelivr.net/gh/sy-records/staticfile/images/swoole/wechat.png)
发布于3年前 · 35 次浏览 · 来自
分享
鲁飞
在之前的版本中,多端口监听的心跳检测功能只能配置在主服务上,无法为每个端口单独设置心跳时间。 例如需要在`9501`端口上设置 `30` 秒,而`9502`端口上设置 `60` 秒。从`v4.7`版本开始进行了支持,下面来详细了解一下。 ## 配置项 在 `Server` 中提供了两个配置项:`heartbeat_check_interval` 和 `heartbeat_idle_time`。 可以使用如下配置项增加心跳检测: ```php $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 秒 ```php 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` 个端口 ```bash telnet 127.0.0.1 9501 telnet 127.0.0.1 9502 telnet 127.0.0.1 9503 ``` 使用 `v4.6` 版本进行测试会输出: ```bash [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`版本进行测试: ```bash [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` 秒之后断开。 这样的输出结果符合所配置的心跳检测配置,需要使用该功能的用户可以进行升级体验。 ![](https://cdn.jsdelivr.net/gh/sy-records/staticfile/images/swoole/wechat.png)
赞
1
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
还没有评论!
微信公众号
热门内容
作者其它话题
- thinkphp5.1在使用think-swoole的时候报错unsupported option [host]
- WSL 下服务器响应数据过大无法接收
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。