首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
swoole websocket服务进行mysql断线重连不生效的问题
代码结构大致是这样的: {{{ <?php class server { private $server; private $conn = null; public function __construct() { if (!$this->initDb()) exit("终止启动\n"); //连接数据库 $this->server = new swoole_websocket_server('111.111.111.111', 1234); //实例化server //消息 $this->server->on('message', function (swoole_websocket_server $server, $frame) { //这里使用数据库连接$conn }); //work进程开启 $this->server->on('workerStart', function (swoole_websocket_server $server, $worker_id) { if ($worker_id == 0) { // 每10秒检测一次数据库连接 $server->tick(10 * 1000, function ($timer_id) { if (!$this->conn->ping()) { echo "数据库已断开!正在尝试重新连接...\n"; $this->initDb(); //连接数据库 } }); } }); $this->server->start(); } // 连接数据库 private function initDb() { $conn = new mysqli('127.0.0.1', 'root','root','test', 3306); if ($conn->connect_errno) { printf("数据库连接失败: %s\n", $conn->connect_error); return false; } else { $conn->set_charset("utf8"); echo "连接数据库成功!\n"; $this->conn = $conn; return true; } } } new server(); }}} 每十秒检测mysql连接状态,如果断开连接则重新走initDb,this->$conn重新赋值。 然后我手动重启数据库,程序检测到数据库断开之后进行重连,并且连接成功。 但是当接收到消息事件使用$conn时,却还是提示mysql server has gone away,明明已经重新连接了啊。 我猜想,是不是因为swoole server在注册事件时就绑定了所使用到的变量,所以conn虽然重新赋值了,但是并没有生效到swoole server里?
发布于7年前 · 1 次浏览 · 来自
提问
自
自命不凡
代码结构大致是这样的: {{{ <?php class server { private $server; private $conn = null; public function __construct() { if (!$this->initDb()) exit("终止启动\n"); //连接数据库 $this->server = new swoole_websocket_server('111.111.111.111', 1234); //实例化server //消息 $this->server->on('message', function (swoole_websocket_server $server, $frame) { //这里使用数据库连接$conn }); //work进程开启 $this->server->on('workerStart', function (swoole_websocket_server $server, $worker_id) { if ($worker_id == 0) { // 每10秒检测一次数据库连接 $server->tick(10 * 1000, function ($timer_id) { if (!$this->conn->ping()) { echo "数据库已断开!正在尝试重新连接...\n"; $this->initDb(); //连接数据库 } }); } }); $this->server->start(); } // 连接数据库 private function initDb() { $conn = new mysqli('127.0.0.1', 'root','root','test', 3306); if ($conn->connect_errno) { printf("数据库连接失败: %s\n", $conn->connect_error); return false; } else { $conn->set_charset("utf8"); echo "连接数据库成功!\n"; $this->conn = $conn; return true; } } } new server(); }}} 每十秒检测mysql连接状态,如果断开连接则重新走initDb,this->$conn重新赋值。 然后我手动重启数据库,程序检测到数据库断开之后进行重连,并且连接成功。 但是当接收到消息事件使用$conn时,却还是提示mysql server has gone away,明明已经重新连接了啊。 我猜想,是不是因为swoole server在注册事件时就绑定了所使用到的变量,所以conn虽然重新赋值了,但是并没有生效到swoole server里?
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2019-06-23
b
bboyazeal
哪位朋友可以指点一下?
赞
0
回复
2019-06-27
浪
浪子
问题已经解决,欣喜万分!原因是这样的: swoole server是多进程模式,所以当接收到事件会分配到空闲的工作进程去执行。 由于进程之间内存是不共享的,而我的代码只是在工作进程0去检测断线重连的,所以重新赋值的mysql连接$conn只作用于工作进程0,其他进程所使用到的mysql连接依然是断开的。 我的解决方案是:不特定工作进程0进行数据库检测重连,而是所有的工作进程都会进行这项操作。 其实,最佳的解决方案还是swoole文档所说的,在每次进行query时就进行检测断线重连,这样的话,重连时
赞
0
回复