在日常 PHP 开发中,mysqli::debug 通常用于简单地查看数据库连接过程和执行细节,它在调试初期可能足够用,但当项目逐渐复杂化,仅依赖 mysqli::debug 往往无法满足对性能瓶颈或复杂查询的深入分析需求。因此,本文将带你了解如何从 mysqli::debug 平滑过渡到更强大的调试工具 —— Xdebug 和 MySQL 慢查询日志,从而系统性地提升数据库调试效率。
mysqli::debug() 的功能相对简单,它只是在 MySQL 客户端库层面开启调试信息输出,用于记录连接、执行等低层信息,但:
不提供 SQL 执行时间;
不易与业务逻辑对应;
输出内容杂乱难以分析;
无法自动追踪调用栈或内存使用。
示例代码:
mysqli::debug("d:t:o,/tmp/client.trace");
$db = new mysqli("localhost", "user", "password", "dbname");
虽然可以输出到 /tmp/client.trace,但阅读和分析效率低下。
Xdebug 是 PHP 最强大的调试扩展之一,它可以实现断点调试、函数调用追踪、性能分析等高级功能。
pecl install xdebug
然后在 php.ini 中添加:
zend_extension=xdebug
xdebug.mode=develop,trace,profile
xdebug.output_dir=/tmp
开启 xdebug.mode=profile 后,每个请求会生成 .cachegrind 文件,可用工具如 QCacheGrind 或 Webgrind 打开分析函数执行时间,包括数据库查询函数。
$mysqli = new mysqli("localhost", "user", "password", "dbname");
$result = $mysqli->query("SELECT * FROM users WHERE email LIKE '%@m66.net'");
你可以清楚看到 query() 的耗时、调用位置等信息,非常适合排查频繁执行的慢查询。
MySQL 慢查询日志 是数据库原生功能,用于记录执行时间超过指定阈值的 SQL 语句,非常适合分析数据库瓶颈。
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
设置完后重启 MySQL 服务:
sudo systemctl restart mysql
mysqldumpslow:命令行快速查看慢查询分布;
pt-query-digest:Percona Toolkit 提供的高级分析工具;
Web 工具:你也可以将日志通过 API 上传至 https://m66.net/analyze-log(例如你自己搭建的工具页面)进行可视化分析。
开发阶段:使用 Xdebug 查看调用关系和数据库调用;
测试阶段:打开 Xdebug profiling 模式进行性能采样;
生产阶段:开启 MySQL 慢查询日志,周期性分析;