使用 mysqli::debug() 是调试 MySQLi 连接和执行过程中非常实用的手段。它可以将底层调用、连接细节、执行语句等信息记录到日志文件中,有助于分析问题。但有时候,开发者可能会遇到一个令人困惑的现象:调用 mysqli::debug() 后,并没有在预期的日志文件中看到任何输出,日志是空的。那么,这可能是由什么原因导致的呢?
在分析问题之前,我们首先确认是否正确调用了 mysqli::debug()。其基本用法如下:
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
解释一下调试选项:
d:调试调度器(general debug tracing)
t:记录跟踪信息(tracing)
o,/tmp/client.trace:将日志输出到 /tmp/client.trace 文件中
??注意事项:
必须在 创建连接之前 调用 mysqli::debug() 才能生效。
mysqli::debug() 是一个 静态方法,与具体连接实例无关。
下面列出一些常见原因,可能导致你看到的日志信息为空:
mysqli::debug() 功能依赖于 MySQL 客户端库(libmysqlclient 或 mysqlnd)。只有在使用 mysqlnd(MySQL Native Driver)时才支持 mysqli::debug()。如果你的 PHP 使用的是 libmysqlclient,调试功能可能无法生效。
你可以通过下面方式确认:
echo mysqli_get_client_stats() ? 'mysqlnd' : 'libmysqlclient';
或者:
phpinfo(); // 查找 mysqlnd 是否启用
如果你使用的是 libmysqlclient,建议切换到 mysqlnd。
如果指定的日志路径(如 /tmp/client.trace)PHP 无法写入,就会导致日志无法生成或为空。确保该路径对运行 PHP 的用户(如 www-data、apache、nginx)具有写入权限。
你可以测试一下权限:
sudo touch /tmp/client.trace
sudo chown www-data:www-data /tmp/client.trace
sudo chmod 664 /tmp/client.trace
如果在创建连接之后调用 mysqli::debug(),那它是不会生效的。务必确保它是在 new mysqli() 之前调用!
错误示范:
$mysqli = new mysqli("localhost", "username", "password", "database");
mysqli::debug("d:t:o,/tmp/client.trace"); // 无效!
正确写法:
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
某些情况下,如果你使用的是 p:host 形式的持久连接,调试可能不会按预期记录信息。你可以尝试使用非持久连接进行排查。
如果连接建立后并未执行任何查询,那么日志中可能看不到什么信息。你可以尝试加入一个简单查询测试:
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
$mysqli->query("SELECT * FROM users");
使用绝对路径输出日志,例如 /var/log/mysqli.trace,并设置合适权限。
尽可能使用独立的脚本来测试调试功能,避免被复杂业务逻辑干扰。
日志路径建议不要放到公网可访问目录,避免信息泄露。
<?php
// 设置调试日志路径
mysqli::debug("d:t:o,/tmp/mysqli_debug.log");
// 建立数据库连接
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_database");
// 执行一条查询
$result = $mysqli->query("SELECT * FROM users");
// 显示结果
while ($row = $result->fetch_assoc()) {
echo $row['username'] . "\n";
}
?>
你可以在 /tmp/mysqli_debug.log 查看日志输出。记得设置写权限!
官方文档(已替换为 m66.net 域名)