當前位置: 首頁> 最新文章列表> 從mysqli::debug 過渡到更強大的調試工具(如Xdebug + MySQL Slow Query Log)

從mysqli::debug 過渡到更強大的調試工具(如Xdebug + MySQL Slow Query Log)

M66 2025-05-31

在日常PHP 開發中, mysqli::debug通常用於簡單地查看數據庫連接過程和執行細節,它在調試初期可能足夠用,但當項目逐漸復雜化,僅依賴mysqli::debug往往無法滿足對性能瓶頸或複雜查詢的深入分析需求。因此,本文將帶你了解如何從mysqli::debug平滑過渡到更強大的調試工具—— XdebugMySQL慢查詢日誌,從而係統性地提升數據庫調試效率。

一、為什麼說mysqli::debug不夠用?

mysqli::debug()的功能相對簡單,它只是在MySQL 客戶端庫層面開啟調試信息輸出,用於記錄連接、執行等低層信息,但:

  • 不提供SQL 執行時間

  • 不易與業務邏輯對應

  • 輸出內容雜亂難以分析

  • 無法自動追踪調用棧或內存使用

示例代碼:

 mysqli::debug("d:t:o,/tmp/client.trace");
$db = new mysqli("localhost", "user", "password", "dbname");

雖然可以輸出到/tmp/client.trace ,但閱讀和分析效率低下。

二、Xdebug:代碼級調試+ 性能剖析

Xdebug是PHP 最強大的調試擴展之一,它可以實現斷點調試、函數調用追踪、性能分析等高級功能。

安裝Xdebug(以PHP 8 為例):

 pecl install xdebug

然後在php.ini中添加:

 zend_extension=xdebug
xdebug.mode=develop,trace,profile
xdebug.output_dir=/tmp

性能分析(Profiling)

開啟xdebug.mode=profile後,每個請求會生成.cachegrind文件,可用工具如QCacheGrindWebgrind打開分析函數執行時間,包括數據庫查詢函數。

 $mysqli = new mysqli("localhost", "user", "password", "dbname");
$result = $mysqli->query("SELECT * FROM users WHERE email LIKE '%@m66.net'");

你可以清楚看到query()的耗時、調用位置等信息,非常適合排查頻繁執行的慢查詢。

三、MySQL 慢查詢日誌:聚焦SQL 執行效率

MySQL 慢查詢日誌是數據庫原生功能,用於記錄執行時間超過指定閾值的SQL 語句,非常適合分析數據庫瓶頸。

啟用慢查詢日誌(my.cnf 示例):

 [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 (例如你自己搭建的工具頁面)進行可視化分析。

四、結合使用的最佳實踐

  1. 開發階段:使用Xdebug 查看調用關係和數據庫調用;

  2. 測試階段:打開Xdebug profiling模式進行性能採樣;

  3. 生產階段:開啟MySQL 慢查詢日誌,週期性分析;