Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO异常+;MySQL上的警告消失了?_Php_Mysql - Fatal编程技术网

PHP PDO异常+;MySQL上的警告消失了?

PHP PDO异常+;MySQL上的警告消失了?,php,mysql,Php,Mysql,我们得到了一个异常和警告。这些警告快把我们逼疯了 警告:PDOStatement::execute():MySQL服务器已在第120行的/home/Database.php中消失 警告:PDOStatement::execute():在第120行的/home/Database.php中读取结果集的头时出错 下面是执行此操作的代码--这只是为了模拟一个正在消失的连接: $db = new PDO('mysql:dbname=' . $name . ';host=' . $host, $user,

我们得到了一个异常和警告。这些警告快把我们逼疯了

警告: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;
}
EDIT:问题是为什么会产生警告和异常。尽管我们特别告诉PDO抛出异常,但上面的代码只会生成这两个异常。
上面的代码比等待我们的服务器默认等待超时更快。


编辑2:我不知道为什么会关闭。问题是,为什么不管PDO错误级别如何,PHP都会产生警告和异常?

为了防止此错误,我只需添加

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

创建PDO对象后,调用您的
->setAttribute

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


(没有测试)

您将
等待超时设置为1,然后睡眠3,会发生什么?MySql将在一秒钟后关闭连接,您将在下一条语句中得到错误“MySql服务器已离开”,因为您已睡眠3秒

编辑

这个问题是重复的

编辑2

此错误的原因:

  • 低等待超时-解决方案:ping、重新连接或增加超时
  • 大数据包-解决方案:在my.cfg中调整
    max_allowed_packet
PDO重新连接-在PDO中模拟ping

编辑3问题更新

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


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

那么问题是什么?为什么要设置会话超时?你这么做想解决什么问题?你解释了症状,但没有解释是什么导致了问题。你也没有解释你想做什么。我需要知道,这不是那个问题的重复。我在问为什么不管ATTR\u ERRMODE设置为ERRMODE\u EXCEPTION,都会出现警告和异常。这不是重复。5个人错了。在回答问题时用了详细信息,因为重复的问题没有解释如何使用PDO进行此操作。但它解释了背后的Mysql逻辑。我更新了问题,在代码片段后面添加了更多细节。抱歉搞混了。谢谢,我会调查一下的。不过我还是希望有其他的事情。我仍然不确定为什么这会被关闭(并被否决),因为这是关于为什么当你设置PDO来给出例外时会有警告。不管怎样,既然你给出的答案回答了这个问题,我就认为它是最好的。谢谢。这不是复制品。这个问题清楚地说明了:当我们告诉f..k PDO抛出异常时,为什么f..k PDO会给我们警告?我更新了这个问题,在代码片段后面添加了更多的细节。很抱歉造成混淆。不幸的是,MySQL驱动程序不支持
PDO::ATTR_TIMEOUT
属性。