http://php.net/manual/en/pdo.error-handling.php
PDO::ERRMODE_WARNING
除了设置错误代码之外,PDO 还会发出传统的 E_WARNING 消息。如果您只想在不中断应用程序流程的情况下查看发生了什么问题,则此设置在调试/测试期间非常有用。
PDO::ERRMODE_EXCEPTION
除了设置错误代码之外,PDO 还会抛出 PDOException 并设置其属性来反映错误代码和错误信息。此设置在调试期间也很有用,因为它会在错误点有效地“炸毁”脚本,很快指出代码中潜在的问题区域(请记住:如果异常导致事务发生,事务会自动回滚)终止脚本)。
异常模式也很有用,因为与传统的 PHP 样式警告相比,您可以更清晰地构造错误处理,并且比在静默模式下运行并显式检查每个数据库调用的返回值更少的代码/嵌套。
然而,代码:
$connection = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '***');
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->query('SET wait_timeout=1;');
sleep(2);
try {
$connection->query('SELECT 1;');
} catch (\Exception $e) {
echo sprintf('Caught %s exception: %s', get_class($e), $e->getMessage()) . PHP_EOL;
}
触发警告:
PHP Warning: PDO::query(): MySQL server has gone away in pdo.php on line 13
PHP Warning: PDO::query(): Error reading result set's header in pdo.php on line 13
Caught PDOException exception: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
重要的:问题不在于 MySQL 服务器消失的问题,而在于 PDO 错误处理。
UPDATE:在所有三种模式下触发警告:ERRMODE_SILENT、ERRMODE_WARNING、ERRMODE_EXCEPTION
PHP 7.2.1 (cli) (built: Jan 5 2018 17:34:14) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies