【问题标题】:PHP PDO Exception + Warning on MySQL Has Gone Away?PHP PDO 异常 + MySQL 上的警告消失了吗?
【发布时间】:2015-12-04 22:52:19
【问题描述】:

我们同时收到 PDOException 和警告。这些警告快把我们逼疯了。

警告:PDOStatement::execute(): MySQL server has gone away in /home/Database.php on line 120

警告: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:我不确定为什么关闭。问题是为什么无论 PDO 错误级别如何,PHP 都会产生警告和异常?

【问题讨论】:

  • 那么问题是什么?
  • 为什么还要设置会话超时?你想通过这样做解决什么问题?您解释了症状,但没有解释导致问题的实际行为。你也没有解释你想要做什么。我需要知道这一点。
  • 这不是那个问题的重复。我在问为什么无论 ATTR_ERRMODE 设置为 ERRMODE_EXCEPTION 为何都会出现警告和异常。
  • 这不是重复的。 5 个人错了。
  • stackoverflow.com/questions/35341276回答了详细信息

标签: php mysql


【解决方案1】:

你将wait_timeout 设置为 1 然后你休眠 3,会发生什么? MySql 将在一秒钟后关闭连接,下一条语句会出现错误“Mysql Server has gone away”,因为你睡了 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

此错误的原因:

  • 低 wait_timeout - 解决方案:ping、重新连接或也增加它
  • 大数据包 - 解决方案:在 my.cfg 中调整 max_allowed_packet

PDO 重新连接 - 在 PDO 中模拟 ping How do i ping the MySQL db and reconnect using PDO

编辑 3 问题已更新

摆脱这些警告的唯一方法(afaik)是设置预期(例如 E_ERROR)error_reporting 级别。例如,您可以包装 pdo 调用以在执行之前设置 E_ERROR 并在执行后重置为默认值。

PDO 记录警告/错误以用于日志目的(原文如此!)以供进一步分析。您设置的属性(通过 setAttribute 或构造函数)仅更改 pdo 的错误处理/行为 - 是否抛出:)。这两件事是分开的。

【讨论】:

  • 作为重复问题提及的问题并未解释如何使用 PDO 执行此操作。但它解释了它背后的Mysql逻辑。
  • 我更新了问题,在代码 sn-p 后面添加了更多细节。很抱歉造成混乱。
  • 谢谢,我会考虑这个可能性。不过,我希望有别的东西。
  • 我仍然不确定为什么它被关闭(并且被否决),因为它是关于为什么在设置 PDO 以提供例外时会出现警告。无论如何,既然您给出的答案回答了这个问题,我将其标记为最佳。谢谢。
  • 这不是重复的。问题清楚地表明:为什么当我们告诉 f..k PDO 抛出异常时会向我们发出警告?
【解决方案2】:

为了防止这个错误,我只是添加了

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

在创建 PDO 对象后发送给您的 ->setAttribute 调用。

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

(没测试过)

【讨论】:

  • 我更新了问题,在代码 sn-p 后面添加了更多细节。很抱歉造成混乱。
  • 很遗憾,MySQL 驱动程序不支持PDO::ATTR_TIMEOUT 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2017-06-03
  • 1970-01-01
  • 2013-03-05
  • 2015-03-01
相关资源
最近更新 更多