當前位置: 首頁> 最新文章列表> 為什麼我用mysqli::debug 後,日誌信息是空的?

為什麼我用mysqli::debug 後,日誌信息是空的?

M66 2025-05-17

使用mysqli::debug()是調試MySQLi 連接和執行過程中非常實用的手段。它可以將底層調用、連接細節、執行語句等信息記錄到日誌文件中,有助於分析問題。但有時候,開發者可能會遇到一個令人困惑的現象:調用mysqli::debug()後,並沒有在預期的日誌文件中看到任何輸出,日誌是空的。那麼,這可能是由什麼原因導致的呢?

一、正確使用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()是一個靜態方法,與具體連接實例無關。

二、日誌為空的常見原因分析

下面列出一些常見原因,可能導致你看到的日誌信息為空:

1. 沒有啟用MySQLi 調試支持

mysqli::debug()功能依賴於MySQL 客戶端庫(libmysqlclient 或mysqlnd)。只有在使用mysqlnd (MySQL Native Driver)時才支持mysqli::debug() 。如果你的PHP 使用的是libmysqlclient ,調試功能可能無法生效。

你可以通過下面方式確認:

 echo mysqli_get_client_stats() ? 'mysqlnd' : 'libmysqlclient';

或者:

 phpinfo(); // 查找 mysqlnd 是否啟用

如果你使用的是libmysqlclient ,建議切換到mysqlnd

2. 沒有寫權限

如果指定的日誌路徑(如/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

3. debug 調用位置不對

如果在創建連接之後調用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");

4. 使用了持久連接

某些情況下,如果你使用的是p:host形式的持久連接,調試可能不會按預期記錄信息。你可以嘗試使用非持久連接進行排查。

5. 沒有實際的SQL 執行

如果連接建立後並未執行任何查詢,那麼日誌中可能看不到什麼信息。你可以嘗試加入一個簡單查詢測試:

 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查看日誌輸出。記得設置寫權限!

五、其他資源