我努力尝试绕过PDO警告,但没有成功。
这是我的代码(文件名和参数都被用XXXXXX
替代):
try {
ini_set('pdo_mysql.debug' , '0');
$pdo = new PDO("mysql:host=XXXXXX;port=XXXXXX;dbname=XXXXXX", 'XXXXXX', 'XXXXXX', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('SET session wait_timeout=1');
$pdo->query('SELECT 1');
echo "SELECT 1\n";
sleep(2);
$pdo->query('SELECT 1');
echo "SELECT 1\n";
} catch (Exception $e) {
echo "Exception: {$e->getMessage()}\n";
}
我尝试使用 ini_set
和不使用它,我试过在构造函数、参数或两者都使用PDO错误模式(例如此示例),我还尝试使用命名主机或其IP地址。
SET wait_timeout
和 sleep
只是为了帮助测试。
无论如何,我总是得到相同的结果:
SELECT 1
PHP Warning: PDO::query(): MySQL server has gone away in XXXXXX/test.php on line 19
PHP Stack trace:
PHP 1. {main}() XXXXXX/test.php:0
PHP 2. PDO->query() XXXXXX/test.php:19
PHP Warning: PDO::query(): Error reading result set's header in XXXXXX/test.php on line 19
PHP Stack trace:
PHP 1. {main}() XXXXXX/test.php:0
PHP 2. PDO->query() XXXXXX/test.php:19
Exception: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
正如您所看到的,异常已被捕获(最后一行),并且使用捕获PDOException
或Throwable
,带或不带反斜杠都可以捕获到。
我只想抑制PHP警告,通常由于ERRMODE_EXCEPTION参数,它不应该出现,但是这个警告总是“弹出”。
有关上下文的几件事:
- 代码的这部分仅用于测试,整个代码在一个名为许多事情的类中调用,我不能不记录PHP警告
- 在生产环境中,我们只有PHP警告(而不是堆栈跟踪)
- 代码在Linux服务器上运行的PHP v7.0中
- 我不想使用
@
来隐藏警告
谢谢