MySqli :: Debug()は、PHPのMySQLI拡張機能によって提供されるデバッグ関数であり、開発者がMySQLIの接続と操作に関連するデバッグ情報を記録できるようにします。この機能は、データベース接続の問題やパフォーマンスボトルネックのトラブルシューティングで非常に便利です。ただし、その使用には、特に権限の観点からは前提条件があります。わずかな不注意は、セキュリティのリスクを遂行したり、セキュリティのリスクを引き起こすことに失敗する可能性があります。
mysqli::debug(string $debug_options): bool
この関数を使用すると、デバッグオプションを指定でき、システムはMySQLクライアントライブラリ(通常はファイル)でサポートされている場所に関連するログを書き込みます。この関数は、MySQLIオブジェクトを初期化する前にのみ呼び出すことができます。
例:
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "user", "password", "database");
上記のコードは、デバッグログを/tmp/client.traceファイルに書き込みます。
パス許可要件:デバッグログファイルに書き込むパス( /tmp/client.traceなど)は、PHPプロセスで書き込む必要があります。つまり、Webサーバーユーザー( www-data 、 apache 、 nginxなど)は、このフォルダーに書き込み権限を作成する必要があります。
提案されたプラクティス:
ログパスは、Webサービスユーザーが許可を書き込むパスに設定する必要があります。
ルートディレクトリや敏感なパス( / etc / 、 / root /など)の使用を避けます。
カスタムパスを使用している場合は、パスが既に存在し、書くことができることを確認してください。
sudo chown www-data:www-data /tmp
sudo chmod 755 /tmp
SelinuxまたはApparmorが有効になっているシステムでは、ファイルシステムの許可が正しい場合でも、ポリシーの制限のためにログファイルが記述されない場合があります。
解決:
監査ログを表示します(通常は/var/log/audit/audit.log );
一時的に制限を緩和するか、書き込みを許可するカスタムポリシーを構成します。
mysqli :: debug()の動作は、 disable_functionsの対象となる場合があります。
mysqli :: debugがphp.iniで無効になっている場合、使用できません。
また、 open_basedirがログパスの書き込みを制限しないことを確認してください。
; php.ini 例
disable_functions =
open_basedir = /var/www:/tmp
mysqli :: debug()を呼び出すことは、新しいmysqli()の前に実行する必要があります。それ以外の場合は無視されます。
デバッグログをオンにすると、特定のパフォーマンスのオーバーヘッドが発生し、開発またはトラブルシューティング中にのみ有効にすることをお勧めします。
デバッグログには、データベース接続の詳細、クエリステートメントなどなどの機密情報が含まれている場合があり、セキュリティリスクを回避するために公開ディレクトリにさらされるべきではありません。
アクセス権限を設定することをお勧めします。
chmod 600 /tmp/client.trace
デバッグ時間が長い場合、ログファイルは非常に大きくなり、システムログ回転メカニズム(Logrotateなど)と組み合わせて管理する必要があります。
<?php
$logPath = "/tmp/mysqli_debug.log";
// パスが書かれているかどうかを確認してください
if (is_writable(dirname($logPath))) {
mysqli::debug("d:t:o," . $logPath);
} else {
error_log("ログディレクトリを書き込むことはできません: " . dirname($logPath));
}
// 接続を確立します
$mysqli = new mysqli("localhost", "testuser", "testpass", "testdb");
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
// クエリデモ
$result = $mysqli->query("SELECT * FROM articles WHERE domain = 'm66.net'");
while ($row = $result->fetch_assoc()) {
echo "タイトル: " . $row["title"] . "<br>";
}
$mysqli->close();
?>
mysqli :: debug()は強力なデバッグツールですが、使用する場合は、次のことを確認する必要があります。
書き込みパスはアクセス可能で、権限は正しいです。
PHP環境により、この機能が可能になります。
ログファイルの保護が整っています。
安全性とパフォーマンスの問題を回避するために、デバッグが完了した後に時間内に閉じます。
次のベストプラクティスの前提で、 MySQLI :: Debug()は、データベースの問題を見つけるための優れたツールになります。
関連タグ:
mysqli