这个问题已经在这里有一个答案:

我们收到了PDOException和警告。这些警告令我们疯狂。

警告:PDOStatement :: execute():第120行的/home/Database.php中的MySQL服务器已经消失

警告: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错误级别?

分享改善这个问题

BogdanamdixonBartłomiejSemańczykeirenaiosSufiyan Ghori 被标记为重复12月5日在10:11

这个问题已经被问过了,已经有了答案。如果这些答案没有完全解决你的问题,请问一个新的问题

 
   
那么问题是什么呢? -  AVProgrammer Dec 4 '15 at 22:54
1 
你为什么设置会话超时?你想通过这样做解决什么问题?你解释症状,但不是你真正在做什么来引起问题。你也不解释你正在努力做什么。我需要知道。 -  Ryan Vincent 12月4日15日23时12分
2 
这不是这个问题的重复。我问为什么有警告和异常,不管ATTR_ERRMODE被设置为ERRMODE_EXCEPTION。 -  Michael Dec 5 '15 at 0:44
1 
这不是重复的。5人错了。 -  gaRex Feb 11 '16 at 8:07
1 

2答案  正确答案 

 
 

你设置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

导致此错误的原因:

  • 低wait_timeout - 解决方案:ping,重新连接或增加它
  • 大包 - 解决方案:调用max_allowed_packetmy.cfg

PDO重新连接 - 在PDO中模拟ping 如何ping数据库并使用PDO重新连接

编辑3个问题更新

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

PDO针对日志目的(sic!)记录警告/错误,以进一步分析。您设置的属性(通过setAttribute或构造函数)只会更改pdo-throw或not :)的错误处理/行为。这两件事情是分开的。

分享改善这个答案
 
   
重复问题的问题不是解释如何使用PDO来解决问题。但它解释了它后面的Mysql逻辑。 -  jankal Dec 4 '15 at 23:04
1 
我更新了这个问题,在代码段后面添加了一些更多的细节。对困惑感到抱歉。 -  Michael Dec 5 '15 at 0:11
   
谢谢,这是我会研究的一个可能性。我希望别的东西。 -  Michael Dec 5 '15 at 0:46
1 
我仍然不知道为什么这是关闭(和downvoted),因为它是为什么当你设置PDO给出例外时有警告。无论如何,由于你给出了答案,我回答了我把它标记为最好的问题。谢谢。 -  Michael Dec 18 '15 at 15:39
1 
这不是重复的。这个问题清楚地表明:为什么当我们告诉它抛出异常时,为什么PDO给我们警告? -  gaRex Feb 11 '16 at 8:09

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

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

->setAttribute创建PDO对象后调用。

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

(没测试)

 
   
我更新了这个问题,在代码段后面添加了一些更多的细节。对困惑感到抱歉。 -  Michael Dec 5 '15 at 0:11
   
不幸的是,PDO::ATTR_TIMEOUTMySQL驱动程序不支持属性。 -  Krzysztof Przygoda 3月23日17:00

不是你要找的答案?浏览其他问题标记  或问自己的问题


来自 https://stackoverflow.com/questions/34098828/php-pdo-exception-warning-on-mysql-has-gone-away