MySQL 服务器已消失 - 但没有连接错误

考虑以下场景:我们有一个 AWS 工作实例(基于 SQS),它打开与 RDS 的持久 MySQL 连接。


$this->connectRegistry[ $host ][ 'connect' ] = mysqli_connect(

    "p:" . $host ,

    $this->hostCredentials[ $host ][ 'username' ] ,

    $this->hostCredentials[ $host ][ 'password' ]

);

现在有时(不是定期)此调用会生成以下警告:


PHP 警告:mysqli_connect():MySQL 服务器已消失


由于 AWS 工作实例使用 Web 服务器处理请求,因此设置基本上与服务网站的常用实例相同。我们在多个项目中使用相同的类,但在一个网站中,这个错误甚至没有发生过一次。


为了了解这些警告的来源,我们尝试在发生连接错误时打印堆栈跟踪,但是 - 现在尴尬的事情开始出现 - 没有连接错误。请看一下整个connect函数:


private function connect ( $host )

{

    $this->connectRegistry[ $host ][ 'connect' ] = mysqli_connect(

        "p:" . $host ,

        $this->hostCredentials[ $host ][ 'username' ] ,

        $this->hostCredentials[ $host ][ 'password' ]

    );

    $error = mysqli_connect_error();

    if( $error ) {

        $this->raiseError( "Connect (" . mysqli_connect_errno() . ") " . $error );

        return false;

    }

    return true;

}

该方法raiseError使用堆栈跟踪等构建完整的错误消息,然后调用trigger_error. 但是,如果触发上述警告,则不会调用此方法。


我们的第一个目标是了解哪些 cronjobs 会触发这些警告 - 也许存在一些性能不佳的查询。


慕娘9325324
浏览 79回答 2
2回答

蓝山帝景

如果你得到,就不会有任何连接错误mysqli_connect(): MySQL 服务器已经消失此消息意味着现有连接不再可用。一定发生了什么事情,MySQL 服务器关闭了连接。造成这种情况的原因可能有很多。最常见的一种是mysqli_close()在代码中的其他地方调用,但由于您在此处使用持久连接,根本原因可能完全不同。您需要调试导致连接断开的原因。但是,我强烈建议完全停止使用持久连接。您不太可能有有效的技术理由来使用它们,并且调试它们可能会很成问题。

浮云间

我在使用 php 守护程序时遇到了此类问题:当您启动守护程序时,会建立 php 连接,如果一段时间没有查询,则数据库连接实际上会终止。过去我找到了两种解决方案要保持连接处于活动状态,请每 n 秒进行一次简单的快速查询在运行时创建连接,而不是在守护程序启动时,而是在守护程序执行工作时创建。我建议第二个选择。“持久”连接并不意味着连接将永远存在,它只是在使用相同的用户名、密码等时被重用,如果您使用方法2),这会有所帮助
打开App,查看更多内容
随时随地看视频慕课网APP