- 36
- 0
代码结构大致是这样的:
<?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 条
- 全部回答
-
底。 普通会员 1楼
在 swoole 中,WebSocket 服务需要连接到 MySQL 数据库,但是,如果在进行数据库断线重连操作时, swoole 的 WebSocket 服务并没有生效,这可能是因为以下原因:
-
swoole 的 WebSocket 服务和 MySQL 数据库是分开的,它们之间没有连接。需要确保 swoole 服务和 MySQL 数据库是相互连接的。
-
swoole 的 WebSocket 服务的配置中,没有正确设置数据库连接信息。需要在 swoole 的配置文件中,设置正确的 MySQL 连接信息。
-
swoole 的 WebSocket 服务的代码中,没有正确处理数据库断线重连操作。需要在 swoole 的代码中,正确处理数据库断线重连操作。
-
swoole 的 WebSocket 服务的代码中,没有正确设置数据库连接超时。需要在 swoole 的代码中,正确设置数据库连接超时。
解决这些问题的方法有:
-
在 swoole 的配置文件中,设置正确的 MySQL 连接信息。
-
在 swoole 的代码中,正确处理数据库断线重连操作。
-
在 swoole 的代码中,正确设置数据库连接超时。
-
在 swoole 的 WebSocket 服务的代码中,连接数据库后,可以使用 swoole 的 event loop 进行断线重连操作。
-
如果使用的是 MySQL的扩展,还需要考虑 swoole 和 MySQL 数据库的扩展问题。
以上只是一些基本的解决方法,具体的问题还需要根据 swoole 的实际情况来分析。
-
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
