首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
heartbeat_idle_time、heartbeat_check_interval但不触发onclose的必现代码
### 问题描述 客户端和服务端代码不要在同一台机器上运行 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.4.24 PHP 7.2 centos7 ### 相关代码 ```php //server代码 $host = '192.168.3.195'; //修改为测试机内网地址 $tcpServer = new \Swoole\Server($host, 8511); $tcpServer->set([ 'worker_num' => 1, 'max_request' => 0, 'heartbeat_check_interval' => 30, 'heartbeat_idle_time' => 60, 'daemonize' => 1, 'log_file' => '/tmp/test-server.log', ]); $tcpServer->on('connect', function ($server, $fd) { echo "tcp client is connected fd=$fd \n"; \Swoole\Timer::tick(1000, function($timer_id) use($fd, $server) { if ($server->exist($fd)) { $server->send($fd, json_encode(range(1, 2000))); } else { \Swoole\Timer::clear($timer_id); } }); }); $tcpServer->on('receive', function ($server, $fd, $reactorId, $recv) { echo "tcp receive fd=$fd, message=$recv \n"; }); $tcpServer->on('close', function ($server, $fd) { echo "tcp client is closed fd=$fd \n"; }); $tcpServer->on('shutdown', function ($server) { echo "server shutdown \n"; }); $tcpServer->start(); //client代码 $host = '192.168.3.195'; //修改为测试机内网地址 $client = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP); go(function () use ($host, $client) { if ($client->connect($host, 8511) == false) { $client->close(); } else { go(function () use($client) { while (true) { $data = $client->recv(1); if (strlen($data) > 0) { //接收到消息长度 echo strlen($data)."\n"; //模拟假死 sleep(10000); } else { if ($data === '') { $client->close(); break; } else { if ($data === false) { if ($client->errCode !== SOCKET_ETIMEDOUT) { $client->close(); break; } } else { $client->close(); break; } } } } }); } }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?
发布于5年前 · 1 次浏览 · 来自
提问
yiyi
### 问题描述 客户端和服务端代码不要在同一台机器上运行 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.4.24 PHP 7.2 centos7 ### 相关代码 ```php //server代码 $host = '192.168.3.195'; //修改为测试机内网地址 $tcpServer = new \Swoole\Server($host, 8511); $tcpServer->set([ 'worker_num' => 1, 'max_request' => 0, 'heartbeat_check_interval' => 30, 'heartbeat_idle_time' => 60, 'daemonize' => 1, 'log_file' => '/tmp/test-server.log', ]); $tcpServer->on('connect', function ($server, $fd) { echo "tcp client is connected fd=$fd \n"; \Swoole\Timer::tick(1000, function($timer_id) use($fd, $server) { if ($server->exist($fd)) { $server->send($fd, json_encode(range(1, 2000))); } else { \Swoole\Timer::clear($timer_id); } }); }); $tcpServer->on('receive', function ($server, $fd, $reactorId, $recv) { echo "tcp receive fd=$fd, message=$recv \n"; }); $tcpServer->on('close', function ($server, $fd) { echo "tcp client is closed fd=$fd \n"; }); $tcpServer->on('shutdown', function ($server) { echo "server shutdown \n"; }); $tcpServer->start(); //client代码 $host = '192.168.3.195'; //修改为测试机内网地址 $client = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP); go(function () use ($host, $client) { if ($client->connect($host, 8511) == false) { $client->close(); } else { go(function () use($client) { while (true) { $data = $client->recv(1); if (strlen($data) > 0) { //接收到消息长度 echo strlen($data)."\n"; //模拟假死 sleep(10000); } else { if ($data === '') { $client->close(); break; } else { if ($data === false) { if ($client->errCode !== SOCKET_ETIMEDOUT) { $client->close(); break; } } else { $client->close(); break; } } } } }); } }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2021-04-28
鲁飞
已在v4.4.x分支修复,https://github.com/swoole/swoole-src/commit/02c4c294663004afbbec3b2da8e0ccbc5b56588f
赞
1
回复
2021-04-16
jw
这里用sleep来模拟假死不行吧,试试直接把client的网络断掉
赞
0
回复
2021-04-16
yiyi
回复
jw
只是重现服务端为啥不触发onclose,假不假死只是我的猜测
赞
0
回复
2021-04-16
michonnehsu
你这里不能直接用sleep,文档里有说明的。要提前声明一个配置才可以。
赞
0
回复
2021-04-16
yiyi
回复
michonnehsu
不管是否可以使用也不能影响到server端已配置心跳检测到时间后的onclose吧
赞
0
回复