考虑以下场景:我们有一个 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 会触发这些警告 - 也许存在一些性能不佳的查询。
蓝山帝景
浮云间