MySqli :: Debug()を使用することは、MySQLI接続と実行のデバッグにおける非常に実用的な方法です。根本的な呼び出し、接続の詳細、実行ステートメント、その他の情報をログファイルに記録し、問題の分析に役立ちます。しかし、開発者は混乱する現象に遭遇する場合があります。Mysqli :: debug()を呼び出した後、予想されるログファイルに出力が表示されず、ログは空です。それで、これの原因は何ですか?
問題を分析する前に、まずmysqli :: debug()が正しく呼ばれているかどうかを確認します。基本的な使用法は次のとおりです。
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
デバッグオプションを説明します。
D :デバッグディスパッチャー(一般的なデバッグトレース)
T :追跡情報を記録する(トレース)
o、/tmp/client.trace :ログを/tmp/client.traceファイルに出力します
??予防:
mysqli :: debug()は、接続を作成する前に呼び出す必要があります。
mysqli :: debug()は、特定の接続インスタンスとは何の関係もない静的メソッドです。
ログ情報を空にする可能性のあるいくつかの一般的な理由は次のとおりです。
mysqli :: debug()関数は、mysqlクライアントライブラリ(libmysqlclientまたはmysqlnd)に依存しています。 mysqli :: debug()は、 mysqlnd (mysqlネイティブドライバー)を使用する場合にのみサポートされます。 PHPがlibmysqlclientを使用している場合、デバッグ機能が有効になる場合があります。
あなたは次のことを確認できます:
echo mysqli_get_client_stats() ? 'mysqlnd' : 'libmysqlclient';
または:
phpinfo(); // 探す mysqlnd 有効にするかどうか
libmysqlclientを使用している場合は、 mysqlndに切り替えることをお勧めします。
指定されたログパス( /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
接続が作成された後にmysqli :: debug()が呼び出された場合、有効になりません。新しい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");
場合によっては、 P:HOSTの形で永続的な接続を使用している場合、デバッグは予想どおりに情報を記録しない場合があります。非密接な接続でトラブルシューティングを試すことができます。
接続の確立後にクエリが実行されない場合、ログに情報がない場合があります。簡単なクエリテストを追加してみてください。
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でログ出力を表示できます。書き込み許可を設定することを忘れないでください!
公式文書(M66.NETドメイン名に置き換えられました)