Есть такой код в 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!