проблема
Мы сообщаем PDO об исключении каждой проблемы. В некоторых случаях он генерирует несколько предупреждений и только затем генерирует исключение.
Почему он это делает?
Дубликаты?
Не было никаких правильных ответов на SO относительно этого. Последний вопрос: PHP PDO Exception + Предупреждение о MySQL ушло? но люди просто отметили его как дубликат, а не тщательно ответили.
Принятый ответ не отвечает, почему он это делает и когда. Поэтому я исследовал и отвечу.
Это из-за того, что PDO может использовать драйвер mysqlnd, который не относится к какой-либо политике PDO «преобразование-проблемы в расширения».
Просто посмотрите на источники драйвера mysqlnd .
Мы отчетливо видим прямые обращения к php_error_docref
.
И один из примеров, показанный на предыдущем вопросе, объясняется следующими строками: https://github.com/php/php-src/blob/PHP-5.5.31/ext/mysqlnd/mysqlnd_wireprotocol.c#L35:L61
Используйте set_error_handler () и restore_error_handler ()
public function query($sql) { $retries = 0; $result = null; while (true) { try { set_error_handler(function () { }); $result = $this->pdo->query($sql); restore_error_handler(); break; } catch (Exception $e) { restore_error_handler(); if (++$retries < self::RECONNECT_ATTEMPT) { if (strpos($e->getMessage(), 'server has gone away') !== false) { $this->connect(); $this->getLogger()->info('Reconnect database, reason: server has gone away'); } } else { throw $e; } } } return $result; }