关于MySQL的PHP​​ PDO异常+警告已经消失了吗?

时间:2015-12-04 22:52:20

标签: php mysql

我们正在获得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错误级别如何都会产生警告和异常?

2 个答案:

答案 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

此错误的原因:

  • low wait_timeout - 解决方案:ping,重新连接或增加
  • 大数据包 - 解决方案:在my.cfg中调整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'));

创建PDO对象后,

->setAttribute次调用。

我真的不知道这是否真的有效,但它应该有用。

(没试过)