Мы получаем как 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?
Вы устанавливаете 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
Причины этой ошибки:
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.
Я действительно не знаю, действительно ли это работает, но оно должно работать.
(не тестировал)