考虑以下场景:我们有一个 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()
在代码中的其他地方调用,但由于您在此处使用持久连接,根本原因可能完全不同。您需要调试导致连接断开的原因。
但是,我强烈建议完全停止使用持久连接。您不太可能有有效的技术理由来使用它们,并且调试它们可能会很成问题。
浮云间
TA贡献1829条经验 获得超4个赞
我在使用 php 守护程序时遇到了此类问题:当您启动守护程序时,会建立 php 连接,如果一段时间没有查询,则数据库连接实际上会终止。
过去我找到了两种解决方案
要保持连接处于活动状态,请每 n 秒进行一次简单的快速查询
在运行时创建连接,而不是在守护程序启动时,而是在守护程序执行工作时创建。
我建议第二个选择。
“持久”连接并不意味着连接将永远存在,它只是在使用相同的用户名、密码等时被重用,如果您使用方法2),这会有所帮助
- 2 回答
- 0 关注
- 122 浏览
添加回答
举报
0/150
提交
取消