php连接失败错误日志不记录,需检查error_log路径与权限、显式启用mysqli异常模式或pdo errmode_exception,并确认2054等底层协议错误需通过mysql用户认证插件调整解决。

连接失败时错误日志不记录?检查 error_log 路径与权限
PHP 7.4 默认不会把 mysqli 或 PDO 的连接失败写进 error_log,除非显式触发错误报告或捕获异常。常见现象是页面空白、Fatal error: Uncaught mysqli_sql_exception 被 FastCGI 吞掉,日志里空空如也。
先确认 PHP 是否真在写日志:
-
php -i | grep error_log查看当前生效的error_log路径(注意不是php.ini里写的路径,而是实际加载的值) - 用
ls -l /var/log/php_errors.log(或你设的路径)确认文件存在且www-data或nobody用户有写权限 - 执行
/www/server/php/74/bin/php -r "error_log('test from cli');",看日志是否追加了这行——没写入说明权限或路径错
宝塔用户特别注意:/www/wwwlogs/php_error.log 是面板默认日志路径,但需在「网站 → 设置 → 错误日志」中手动开启,否则不生效。
mysqli_connect() 报错不进日志?必须主动触发 error_reporting
mysqli_connect() 失败时默认只返回 false,不抛异常也不打日志。靠 display_errors = Off + log_errors = On 挡不住它。
正确做法是显式检查返回值并触发错误:
$conn = mysqli_connect('127.0.0.1', 'user', 'pass', 'db', 3306);
if (!$conn) {
error_log('MySQL connect failed: ' . mysqli_connect_error(), 0);
die('DB unavailable');
}
或者更彻底地启用异常模式(推荐):
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = mysqli_connect('127.0.0.1', 'user', 'pass', 'db', 3306); // 一旦失败直接 throw mysqli_sql_exception
这样异常会被 set_exception_handler() 捕获,也能进 error_log(前提是 handler 里调用了 error_log())。
PDO 连接失败 silent fail?加 ATTR_ERRMODE 才写日志
PDO::__construct() 默认是 PDO::ERRMODE_SILENT,连不上只返回对象,$pdo->errorCode() 才有值,error_log 完全沉默。
必须显式设置错误模式:
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 关键
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', $user, $pass, $options);
此时连接失败会抛 PDOException,可被 try/catch 捕获并记录:
try {
$pdo = new PDO(...);
} catch (PDOException $e) {
error_log('PDO connect failed: ' . $e->getMessage() . ' (' . $e->getCode() . ')', 0);
http_response_code(500);
}
别漏掉 PDO::ERRMODE_WARNING:它会触发 E_WARNING,能进 error_log,但不中断流程,适合监控场景。
报错 2054(caching_sha2_password)不记日志?因为根本没到 PHP 错误层
mysqli_connect(): (HY000/2054): The server requested authentication method unknown to the client 这类错误发生在 TCP 握手阶段,libmysql 驱动压根没机会生成 PHP 错误,error_log 自然为空。
验证方式:
- 用
/www/server/php/74/bin/php -r "new mysqli('127.0.0.1','root','xxx');"直连测试,如果 CLI 下也报 2054,说明是认证插件问题,不是日志配置问题 - 解决路径只有两条:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';,或升级 PHP 到 7.4.22+(含新版 mysqlnd)
这类底层协议错误不会触发 error_log,硬要留痕只能靠前置 shell 脚本检测 MySQL 版本和用户插件,或在应用入口加 file_put_contents('/tmp/db_probe.log', date('c') . " 2054 detected\n", FILE_APPEND);。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











