Почему PDO генерирует предупреждения, когда мы говорим, что это не делать?

проблема

Мы сообщаем 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; }