PHP開発では、 mysqli :: debug()はあまり知られていませんが非常に有用な機能です。特に複雑なデータベース接続またはクエリの問題を扱う場合、MySQLI拡張機能の内部実行をデバッグするために使用できます。
この記事では、Dockerまたは仮想マシン環境でMySqli :: Debug()を有効にして使用して、デバッグ効率を向上させる方法について説明します。
mysqli :: debug()は、php mysqli拡張機能によって提供されるデバッグツールです。その機能は、MySQLIのデバッグ情報を指定されたファイルに出力することです。標準の出力やブラウザへの出力ではありませんが、サーバー上にファイルをログに記録するように書き込みます。
通話方法は非常に簡単です:
mysqli::debug("d:t:o,/tmp/client.trace");
パラメーターの意味「D:T:O、/TMP/Client.Trace」は次のとおりです。
D :デバッグ情報。
T :スレッド情報。
O :ファイルへの出力。
/tmp/client.trace :出力ファイルパス。
注:この関数を使用する前に、MySQLクライアントライブラリのデバッグサポートを有効にする必要があります。そうしないと、この関数呼び出しは無効になります。
この機能をDockerコンテナまたは仮想マシンで使用する場合、2つの前提条件に注意する必要があります。
PHPはCLIまたはFPMモードで実行し、 MySQLNDドライバーを有効にする必要があります。
コンテナまたは仮想マシンのPHPは、デバッグサポートでコンパイルする必要があります。
次のコマンドを実行して、PHPがmysqliのデバッグをサポートするかどうかを確認します。
php -i | grep 'Client API version'
結果にmysqlndが含まれている場合、サポートを意味します。それ以外の場合は、PHPを再コンパイルするか、 mysqlndを含むPHP画像をインストールする必要がある場合があります。
Dockerを使用する場合は、次のようにDockerFileで構成できます。
FROM php:8.2-cli
RUN docker-php-ext-install mysqli \
&& echo "mysqli.allow_local_infile=On" >> /usr/local/etc/php/php.ini
# オプション:デバッグファイルパスをマウントします
VOLUME /tmp
次に、PHPで次のコードテストを書きます。
<?php
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("db.m66.net", "root", "password", "test");
if ($mysqli->connect_errno) {
echo "接続に失敗しました: " . $mysqli->connect_error;
exit();
}
$result = $mysqli->query("SELECT * FROM users");
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$mysqli->close();
このスクリプトを実行した後、 /tmp/ client.traceファイルでデバッグ情報を表示できます。
仮想マシンでの使用は、ネイティブまたはDockerを使用することと変わりません。注意すべき唯一のことは、PHPプロセスが、 /TMPや指定したマウントディレクトリなど、設定したログファイルのパスに書き込む許可を持たなければならないことです。
デバッグログのコンテンツは、ほぼ次のとおりです(抜粋):
>mysql_real_connect
>mysql_send_query
<mysql_read_query_result
...
これらのログを介して、接続障害の理由、遅いクエリの実行、さらにはDNS構成エラーによる遅延を見つけることさえできます。
生産環境では、 MySqli :: Debug()の有効化を避ける必要があります。これは、データベース接続情報やクエリコンテンツなどの機密データがリークするためです。開発またはテスト環境でのみ推奨され、生成されたログファイルをクリーンアップするように注意してください。
Dockerまたは仮想マシン環境でMySQLI :: DEBUG()を使用することは複雑ではありません。重要なのは次のとおりです。
PHPがmysqlndを使用していることを確認してください。
コンテナまたは仮想マシン内のログパスの権限を設定します。
デバッグが完了した後、時間内にログを無効または削除します。
このツールを合理的に使用することにより、データベースの問題のトラブルシューティング時に、より効率的かつ正確になります。
同様のデバッグ要件がある場合は、試してみることもできます!