我们正在获得PDOException和警告。这些警告让我们疯狂。
警告:PDOStatement :: execute():MySQL服务器已经在第120行的/home/Database.php中消失了
警告:PDOStatement :: execute():在第120行的/home/Database.php中读取结果集的标题时出错
以下是执行此操作的代码 - 这只是为了模拟连接消失:
$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;
}
编辑:问题是为什么会产生警告和异常。上面的代码只是生成两者,即使我们明确告诉PDO抛出异常 上面的代码比等待我们的服务器默认wait_timeout更快。
编辑2:我不确定为什么关闭它。问题是为什么PHP无论PDO错误级别如何都会产生警告和异常?
答案 0 :(得分:3)
你将wait_timeout
设为1然后你睡3,会发生什么? MySql会在一秒钟后关闭连接,你会收到错误" Mysql Server已经消失了#34;下一个陈述'因为你睡了3个。
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout
修改强>
问题与MySQL error 2006: mysql server has gone away
重复编辑2
此错误的原因:
max_allowed_packet
PDO重新连接 - 在PDO How do i ping the MySQL db and reconnect using PDO
中模拟ping编辑3 更新问题
摆脱这些警告的唯一方法(afaik)是设定预期(例如E_ERROR)error_reporting等级。你可以将pdo调用包装起来,例如先设置E_ERROR,然后在执行后重置为默认值。
PDO记录日志警告/错误(原文如此!)以进行进一步分析。您设置的属性(通过setAttribute或构造函数)仅更改pdo的错误处理/行为 - throw或不:)。这两件事是分开的。
答案 1 :(得分:-2)
为防止出现此错误,我只需添加
$db->setAttribute(PDO::ATTR_TIMEOUT,ini_get('max_execution_time'));
到->setAttribute
次调用。
我真的不知道这是否真的有效,但它应该有用。
(没试过)