特に1つのアプリケーションで複数のデータベース接続を処理する場合、PHP開発を行う場合、データベース操作のデバッグが複雑になる可能性があります。 PHPのMySqli :: Debug Methodは、データベース接続の分析、ステートメントの実行、さらには根本的なネットワークアクティビティの表示にも適していない、あまり重要ではないが非常に有用なデバッグツールです。
この記事では、複数のデータベース接続をデバッグするときにMySQLI ::デバッグメソッドを効果的に使用する方法を詳細に紹介し、サンプルコードと組み合わせて説明します。
mysqli :: debug()は、mysqli拡張機能で提供される静的メソッドです。これは、主に開発およびデバッグプロセスで使用されるMySQLクライアントライブラリにデバッグ情報を送信するために使用されます。この関数は何も返さず、その主な機能は、クライアントライブラリによって構成されたデバッグファイルにデバッグ情報を書き込むことです。
それを機能させるには、 my.cnfまたはmy.iniでデバッグサポートを有効にする必要があります(通常はdebug = d:o、/tmp/client.traceを介して構成されています)。この方法を使用してロギングをトリガーする必要があります。
mysqli::debug("d:t:o,/tmp/client.trace");
これにより、 /tmp/ client.traceにデバッグ情報が記述されます。
プライマリデータベースや複数の読み取りレプリカなど、複数のデータベースがアプリケーションに接続されている場合、デバッグをよりターゲットにする必要があります。ここにいくつかの推奨戦略があります。
データベース接続プロセスをカプセル化し、各接続に識別名を追加し、出力ログのソースを区別できます。
function connect_to_db($label, $host, $user, $pass, $db) {
mysqli::debug("d:t:o,/tmp/{$label}_trace.log"); // 接続ごとにデバッグファイルを設定します
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
die("接続に失敗しました ({$label}): " . $conn->connect_error);
}
return $conn;
}
$main_db = connect_to_db("main", "localhost", "root", "password", "main_db");
$replica_db = connect_to_db("replica", "localhost", "root", "password", "replica_db");
MySqli :: Debugは基礎となるデバッグ情報ですが、PHPのログ出力を使用した完全なデバッグリンクを形成できます。
mysqli::debug("d:t:o,/tmp/replica_trace.log");
$replica_conn = new mysqli("localhost", "user", "pass", "replica_db");
if ($replica_conn->connect_error) {
error_log("レプリカデータベースに接続できませんでした: " . $replica_conn->connect_error);
} else {
error_log("レプリカデータベースに正常に接続します: " . $replica_conn->host_info);
}
http://m66.net/log-viewerなどを使用して、ログ表示インターフェイスを構築して問題をすばやく見つけることができます。
開発環境またはテスト環境では、毎回MySqli ::デバッグに手動で電話をかけたくない場合があります。現時点では、環境変数または構成ファイルを使用して、デバッグを有効にするかどうかを制御できます。
if (getenv("DB_DEBUG") === "true") {
mysqli::debug("d:t:o,/tmp/debug_trace.log");
}
.envファイルを追加します:
DB_DEBUG=true
mysqli_report()を組み合わせると、エラーをキャッチすることができます。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
mysqli::debug("d:t:o,/tmp/debug_trace.log");
$conn = new mysqli("localhost", "user", "pass", "some_db");
これにより、サイレント障害の代わりに例外がスローされるため、コードレベルで問題を追跡しやすくなります。