Есть такой код в mysqli-адаптере:
function _performEscape($s, $isIdent)
{
if (!$this->link) {
$this->_lazyConnect();
}
if (!$isIdent) {
return "'" . $this->link->real_escape_string($s) . "'";
} else {
return "`" . str_replace('`', '``', $s) . "`";
}
}
Код выше обычно работает ок, но, в моменты пиковых нагрузок на БД воркеры могут выбрасывать такие exceptions:
mysqli::real_escape_string(): invalid object or resource mysqli
Не очень понятна природа таки ошибок, ведь до выполнения функции _performEscape connection должен быть в любом случае установлен. А для выполнения mysqli::real_escape_string вообще не нужен действующий коннекшен к БД. Следующий код подтверждает, что при потере коннекта с базой запросы не проходят, но real_escape_string работает.
$link = mysqli_init();
$link->real_connect(
'localhost',
'root',
'',
'test'
);
`sudo service mysql restart`;
$link->query('SHOW TABLES');
// выбрасывается ErrorException: Error while sending QUERY packet.
$link = mysqli_init();
$link->real_connect(
'localhost',
'root',
'',
'test'
);
`sudo service mysql restart`;
$link->real_escape_string('aaaaaa');
// всё ok
$link = mysqli_init();
$link->real_connect(
'localhost',
'root',
'',
'test'
);
`sudo service mysql stop`; //STOP!!!
$link->real_escape_string('aaaaaa');
// всё ok!