MySQL拡張機能は、PHPを使用してMySQLデータベースを操作する場合、非常に一般的なツールです。現在の接続で使用される文字セット情報を取得するには、 $ mysqli-> get_charset()を呼び出す必要がある場合があります。
get_charset()自体は、データベースを照会するほど時間がかかりませんが、高周波リクエストまたはループで頻繁に呼ばれる場合、不必要なオーバーヘッドをもたらす可能性があります。パフォーマンスを最適化するために、 get_charset()の結果をキャッシュすることを検討して、繰り返しの呼び出しを避けます。
この記事では、MySQLI :: get_charset()関数の結果をキャッシュすることにより、データベース操作の効率を改善する方法について説明します。
mysqli :: get_charset()関数は、 charset 、照合、コメントなど、現在の接続で使用される文字セット情報を含むオブジェクトを返します。
例えば:
$mysqli = new mysqli('localhost', 'user', 'password', 'database');
$charsetInfo = $mysqli->get_charset();
echo $charsetInfo->charset; // 出力例:utf8mb4
ほとんどの場合、接続が確立された後に文字セットは通常変更されないため、毎回それを呼び出す必要はありません。
複雑なアプリケーションでは、特に大規模なフレームワークまたは高い並行シナリオでは、コードが各データベース操作でget_charset()を1回呼び出す場合、多数の繰り返されるオブジェクトの作成と関数呼び出しが生成され、CPUとメモリリソースが無駄になります。
単純なキャッシュ(例:静的変数、グローバル変数、シングルトンモードを使用)を使用すると、この情報を1回だけ取得してから、スクリプトライフサイクル全体で再利用できます。
簡単な実装ソリューションは次のとおりです。
class DatabaseConnection {
private $mysqli;
private $charsetInfo = null;
public function __construct($host, $user, $password, $database) {
$this->mysqli = new mysqli($host, $user, $password, $database);
if ($this->mysqli->connect_error) {
die('接続に失敗しました:' . $this->mysqli->connect_error);
}
}
public function getCharsetInfo() {
if ($this->charsetInfo === null) {
$this->charsetInfo = $this->mysqli->get_charset();
}
return $this->charsetInfo;
}
public function query($sql) {
return $this->mysqli->query($sql);
}
public function close() {
$this->mysqli->close();
}
}
// 使用の例
$db = new DatabaseConnection('localhost', 'user', 'password', 'database');
// 最初の呼び出し,実行します get_charset()
$charset = $db->getCharsetInfo();
echo '現在の文字セット:' . $charset->charset . '<br>';
// 後続の呼び出し,キャッシュされた値を直接使用します
$charsetAgain = $db->getCharsetInfo();
echo 'キャラクターセットをもう一度取得します(キャッシュ):' . $charsetAgain->charset . '<br>';
// 他のクエリを実行します
$result = $db->query('SELECT * FROM users');
while ($row = $result->fetch_assoc()) {
echo $row['username'] . '<br>';
}
$db->close();
関数呼び出しのオーバーヘッド<br>を削減します 頻繁にget_charset()を呼び出す回数を減らします。特にループまたは高い並行シナリオで。
コードメンテナビリティを改善<BR> 文字セット情報を中央に管理します。将来、キャッシュポリシーを拡張または変更する必要がある場合は、1つの場所を変更するだけです。
デバッグして監視しやすい<br> キャッシュ層は、ログ、デバッグ出力、またはキャッシュ障害メカニズムを簡単に追加できます。
アプリケーションが分散または長い接続(Swoole、Workermanなど)の場合、キャッシュを接続プールまたはグローバルマネージャーに拡張することをお勧めします。
たとえば、APCU、Memcached、またはRedisで接続構成をキャッシュし、必要に応じてプロセス全体で共有して、初期化コストをさらに削減できます。
同時に、注:マルチスレッドまたはマルチプロセスシナリオでは、静的変数とオブジェクト属性のキャッシュは現在のプロセスでのみ有効であり、アプリケーションアーキテクチャと組み合わせて戦略を調整する必要があります。