Исключение PHP PDO + Предупреждение о MySQL ушло в прошлое?

Мы получаем как PDOException, так и предупреждения. Эти предупреждения сводят нас с ума.

Предупреждение: PDOStatement :: execute (): сервер MySQL ушел в /home/Database.php в строке 120

Предупреждение: PDOStatement :: execute (): Ошибка чтения заголовка набора результатов в /home/Database.php в строке 120

Вот код, который делает это – это просто симуляция соединения :

$db = new PDO('mysql:dbname=' . $name . ';host=' . $host, $user, $pass); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $statement = $db->prepare('SET SESSION wait_timeout = 1'); $statement->execute(); sleep(3); try { $statement = $db->prepare('SELECT 1'); $statement->execute(); } catch (PDOException $e) { echo 'Exception! Err #:' . $e->errorInfo[1] . PHP_EOL; } 

EDIT: Вопрос в том, почему это порождает предупреждение и исключение. Вышеприведенный код генерирует оба значения, даже если мы специально указываем PDO на выбор исключений.
Вышеприведенный код делает это быстрее, чем ждать наших серверов по умолчанию wait_timeout.

EDIT 2: Я не знаю, почему это было закрыто. Вопрос в том, ПОЧЕМУ, что PHP порождает как предупреждение, так и исключение, независимо от уровня ошибки PDO?

Solutions Collecting From Web of "Исключение PHP PDO + Предупреждение о MySQL ушло в прошлое?"

Вы устанавливаете wait_timeout в 1, затем вы спите 3, что произойдет? MySql закроет соединение через одну секунду, и вы получите сообщение об ошибке «Mysql Server ушел» со следующим утверждением, потому что вы спите на 3.

http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout

редактировать

Вопрос – дубликат ошибки MySQL 2006: mysql server ушел

изменить 2

Причины этой ошибки:

  • low wait_timeout – решение: пинг, повторно подключить или увеличить его
  • большие пакеты – решение: настройте max_allowed_packet в my.cfg

PDO reconnect – имитировать ping в PDO. Как выполнить ping MySQL db и повторно подключиться с помощью PDO

изменить 3 вопрос обновлен

Единственный способ (afaik) избавиться от этих предупреждений – установить ожидаемый (например, E_ERROR) уровень error_reporting . Вы могли бы завернуть вызовы pdo, например, для установки E_ERROR и сброса до значения по умолчанию после выполнения.

PDO регистрирует предупреждения / ошибки для целей журналов (sic!) Для дальнейшей аналитики. Атрибут, который вы установили (с помощью setAttribute или constructor), только изменяет обработку ошибок / поведение pdo-throw или нет :). Эти две вещи разделены.

Чтобы предотвратить эту ошибку, я бы просто добавил

$db->setAttribute(PDO::ATTR_TIMEOUT,ini_get('max_execution_time'));

к вашим ->setAttribute вызовам после создания объекта PDO.

Я действительно не знаю, действительно ли это работает, но оно должно работать.

(не тестировал)