在日常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 慢查詢日誌,週期性分析;