账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    swoole websocket服务进行mysql断线重连不生效的问题
    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
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 底。 普通会员 1楼

      在 swoole 中,WebSocket 服务需要连接到 MySQL 数据库,但是,如果在进行数据库断线重连操作时, swoole 的 WebSocket 服务并没有生效,这可能是因为以下原因:

      1. swoole 的 WebSocket 服务和 MySQL 数据库是分开的,它们之间没有连接。需要确保 swoole 服务和 MySQL 数据库是相互连接的。

      2. swoole 的 WebSocket 服务的配置中,没有正确设置数据库连接信息。需要在 swoole 的配置文件中,设置正确的 MySQL 连接信息。

      3. swoole 的 WebSocket 服务的代码中,没有正确处理数据库断线重连操作。需要在 swoole 的代码中,正确处理数据库断线重连操作。

      4. swoole 的 WebSocket 服务的代码中,没有正确设置数据库连接超时。需要在 swoole 的代码中,正确设置数据库连接超时。

      解决这些问题的方法有:

      1. 在 swoole 的配置文件中,设置正确的 MySQL 连接信息。

      2. 在 swoole 的代码中,正确处理数据库断线重连操作。

      3. 在 swoole 的代码中,正确设置数据库连接超时。

      4. 在 swoole 的 WebSocket 服务的代码中,连接数据库后,可以使用 swoole 的 event loop 进行断线重连操作。

      5. 如果使用的是 MySQL的扩展,还需要考虑 swoole 和 MySQL 数据库的扩展问题。

      以上只是一些基本的解决方法,具体的问题还需要根据 swoole 的实际情况来分析。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部