首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
disconnect中耗时操作导致 check_worker_exit_status: worker#1 abnormal exit
### 问题描述 在ws.send消息之前只要 onclose 中有耗时操作就会报错 ### Swoole版本,PHP版本,以及操作系统版本信息 Version => 4.5.5 centos7 php7.2 ### 相关代码 ```php class WebSocket { public $server; function __construct($host='0.0.0.0', $port='8082') { $this->server = new \Swoole\WebSocket\Server($host, $port); $this->server->set([ 'log_level' => SWOOLE_LOG_WARNING, 'heartbeat_check_interval' => 30, 'heartbeat_idle_time' => 60, 'reactor_num' => 1, 'worker_num' => 2, ]); $this->server->on('open', [$this, '_onOpen']); $this->server->on('close', [$this, '_onClose']); $this->server->start(); } public function _onOpen($ws, $request){ $data = $request->get; if($data['token'] != 123){ //不能正常返回code 和 reason !!!! $ws->disconnect($request->fd, 1000, '登录已失效,请重新登录。'); } } public function _onClose($ws, $fd){ //耗时操作 sleep(1); echo 'quit success'.PHP_EOL; } } new WebSocket(); ``` ```javascript <script> var ws = new WebSocket('ws://127.0.0.1:8082?token=1234'); ws.onopen = function (event) { console.log('websocket连接成功...'); console.log(event); }; ws.onclose = function (event) { console.log('链接关闭'); console.log(event); }; ws.onerror = function (event) { console.log('出错了'); console.log(event); }; </script> ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 期待:$ws->disconnect 可以正常返回错误码 和 reason 实际: 
发布于5年前 · 50 次浏览 · 来自
提问
iwaite
### 问题描述 在ws.send消息之前只要 onclose 中有耗时操作就会报错 ### Swoole版本,PHP版本,以及操作系统版本信息 Version => 4.5.5 centos7 php7.2 ### 相关代码 ```php class WebSocket { public $server; function __construct($host='0.0.0.0', $port='8082') { $this->server = new \Swoole\WebSocket\Server($host, $port); $this->server->set([ 'log_level' => SWOOLE_LOG_WARNING, 'heartbeat_check_interval' => 30, 'heartbeat_idle_time' => 60, 'reactor_num' => 1, 'worker_num' => 2, ]); $this->server->on('open', [$this, '_onOpen']); $this->server->on('close', [$this, '_onClose']); $this->server->start(); } public function _onOpen($ws, $request){ $data = $request->get; if($data['token'] != 123){ //不能正常返回code 和 reason !!!! $ws->disconnect($request->fd, 1000, '登录已失效,请重新登录。'); } } public function _onClose($ws, $fd){ //耗时操作 sleep(1); echo 'quit success'.PHP_EOL; } } new WebSocket(); ``` ```javascript <script> var ws = new WebSocket('ws://127.0.0.1:8082?token=1234'); ws.onopen = function (event) { console.log('websocket连接成功...'); console.log(event); }; ws.onclose = function (event) { console.log('链接关闭'); console.log(event); }; ws.onerror = function (event) { console.log('出错了'); console.log(event); }; </script> ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 期待:$ws->disconnect 可以正常返回错误码 和 reason 实际: 
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-10-23
鲁飞
我本地没有复现codedump,你在onOpen里不需要用这个,直接close就行了。 用disconnect时这里看console,关闭状态码是1006而不是1000。 在onMessage里可以用disconnect
赞
0
回复
2020-10-23
iwaite
回复
鲁飞
但我主动拒绝连接的时候 我需要告知前端理由 直接用close的话 是没法给code的啊 多快速刷新几次页面就会出现这问题
赞
0
回复
2020-10-23
iwaite
回复
鲁飞
但是我主动拒绝前端连接时候要给前端返回 拒绝原因code 如果用close的话就没法返回信息了啊 请问大大有没有什么好的建议?
赞
0
回复
2020-10-23
鲁飞
回复
iwaite
没复现coredump, 改成一个worker_num,使用gdb调试下,将日志发到github你提issue的地方。 https://wiki.swoole.com/#/other/issue?id=%e6%8f%90%e4%ba%a4%e9%94%99%e8%af%af%e6%8a%a5%e5%91%8a
赞
0
回复
2020-10-23
iwaite
回复
鲁飞
发了 大佬有空的时候可以去看下 还需要啥 我尽量提供 thanks~
赞
0
回复
2020-10-27
Rango
回复
iwaite
请使用 `4.5.6` 版本
赞
0
回复
2022-03-11
koopwewe
你好,后来这个问题解决了吗?我也遇到同样的问题,报错Server::check_worker_exit_status(): worker(pid=31699, id=0) abnormal exit 
赞
0
回复