为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕娘9325324 2023-11-03 10:52:36
考虑以下场景:我们有一个 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 会触发这些警告 - 也许存在一些性能不佳的查询。
查看完整描述

2 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

如果你得到,就不会有任何连接错误

mysqli_connect(): MySQL 服务器已经消失

此消息意味着现有连接不再可用。一定发生了什么事情,MySQL 服务器关闭了连接。造成这种情况的原因可能有很多。最常见的一种是mysqli_close()在代码中的其他地方调用,但由于您在此处使用持久连接,根本原因可能完全不同。您需要调试导致连接断开的原因。

但是,我强烈建议完全停止使用持久连接。您不太可能有有效的技术理由来使用它们,并且调试它们可能会很成问题。


查看完整回答
反对 回复 2023-11-03
?
浮云间

TA贡献1829条经验 获得超4个赞

我在使用 php 守护程序时遇到了此类问题:当您启动守护程序时,会建立 php 连接,如果一段时间没有查询,则数据库连接实际上会终止。

过去我找到了两种解决方案

  1. 要保持连接处于活动状态,请每 n 秒进行一次简单的快速查询

  2. 在运行时创建连接,而不是在守护程序启动时,而是在守护程序执行工作时创建。

我建议第二个选择。

“持久”连接并不意味着连接将永远存在,它只是在使用相同的用户名、密码等时被重用,如果您使用方法2),这会有所帮助


查看完整回答
反对 回复 2023-11-03
  • 2 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信