Web開発では、特にPHP + MySQLを使用したプロジェクトでは、開発環境とオンライン環境の間のデータベースの動作の違いは、しばしば一連の奇妙な問題を引き起こします。たとえば、一部のクエリはローカルで高速ですが、オンラインはカタツムリと同じくらい遅いです。または、ローカルで報告されるエラーはありませんが、オンライン実行は失敗します。この場合、それを追跡する明確な手がかりがない場合、多くの時間が無駄になる可能性があります。
幸いなことに、PHPのMySQLI拡張機能は、非常に実用的なデバッグツールであるMySQLI :: Debug()メソッドを提供します。このアプローチはよく知られていませんが、特に問題の問題とパフォーマンスの最適化において、いくつかのシナリオで重要なヘルプを提供できます。
mysqli :: debug()は、debug出力を有効にするmysqliクラスの静的な方法です。 libmysqlclientのデバッグ情報を記録できます。フォーマットは次のとおりです。
mysqli::debug("d:t:o,/tmp/client.trace");
パラメーター説明:
D :デバッグをオンにします
T :各スレッドのデバッグファイルを作成します
o、/tmp/client.trace :出力ファイルパスを指定します
??注:この方法は、 libmysqlclientを使用する場合にのみ有効であり、通常はデバッグフェーズでのみ有効になります。生産環境は、デフォルトで有効にされることを避ける必要があります。
以下は、典型的な使用シナリオです。
<?php
mysqli::debug("d:t:o,/tmp/dev_trace.log");
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$result = $mysqli->query("SELECT * FROM users WHERE status = 'active'");
while ($row = $result->fetch_assoc()) {
echo $row['name'] . "<br>";
}
$mysqli->close();
?>
/tmp/dev_trace.logファイルを表示して、SQL実行プロセス、接続プロセス、その他の詳細の詳細について詳しく知ることができます。
<?php
mysqli::debug("d:t:o,/tmp/prod_trace.log");
$mysqli = new mysqli("127.0.0.1", "user", "password", "database");
// 通常、ロギングアクセスインターフェイスをお勧めします,例えば:
$url = "https://m66.net/api/user/status"; // 例 URL
file_put_contents("/tmp/trace_log_access.log", "訪問: $url\n", FILE_APPEND);
$result = $mysqli->query("SELECT * FROM users WHERE status = 'active'");
while ($row = $result->fetch_assoc()) {
// 処理を簡素化します
}
$mysqli->close();
?>
DIFFツールやIDE比較関数を使用して、どの動作が一貫性がないかを確認するなど、開発環境と生産環境でトレースファイルを比較できます。
クエリ実行時差
暗黙の変換(数字への文字列など)はありますか
再試行するための接続はありますか?
SQL Optimizerは別のインデックスを選択しますか?
2つの環境のトレースファイルを比較することで、次のことができます。
ゆっくりとしたクエリの理由を特定します。
クエリロジックは変更されていませんが、オンラインは遅いですか?インデックスが同期されていない可能性があります。
接続構成の違いを確認します:
max_allowed_packetとタイムアウトのさまざまな設定は、動作に影響を与える可能性があります。
データベースバージョンの違いの影響を特定します。
一部のSQLの著作は、5.7および8.0の実行計画では非常に異なる場合があります。
補助的なポジショニング「オンラインは再現できません」の問題:
Traceログは、実行プロセス全体を明確に表示でき、「コードは正しいがエラーが発生する」の死角を回避できます。
MySqli :: Debug()は、日常生活の開発者にとって必須ツールではありませんが、複雑なデータベースの問題をトラブルシューティングする際に重要な手がかりを提供できます。それを使用して開発環境の動作をオンライン環境と比較することは、非常に低コストで高報酬のデバッグ戦略です。
使用のタイミングを習得して許可とファイルの場所を制御する限り、 mysqli :: debug()は、パフォーマンスを最適化し、違いをトラブルシューティングするための秘密兵器になります。