データベースクエリのパフォーマンスを最適化することは、高性能PHPアプリケーションを開発する際の一般的な課題です。特に大量のデータを処理する場合、同じクエリを繰り返し実行すると、アプリケーションの応答時間が大幅に遅くなる可能性があります。この時点で、キャッシュされたクエリの結果が効果的な最適化方法になります。この記事では、 mysqli_resultクエリの結果をRedisまたはファイルシステムにキャッシュすることにより、PHPアプリケーションのパフォーマンスを最適化する方法について説明します。
アプリケーションがデータベースクエリを実行するたびに、データベースエンジンはハードディスクのデータを読み取り、クエリの結果を生成します。これらのクエリが重複しており、データがまれに変化する場合、毎回データベースから同じデータを読み取る必要はありません。キャッシュテクノロジーは、クエリの結果をメモリ(Redisなど)に保存したり、ローカルファイルシステムに保存したり、データベースアクセスの頻度を減らし、アプリケーションのパフォーマンスを改善したりできます。
Redisは、特に頻繁にアクセスされるデータの保存に適したデータのキャッシュによく使用されるオープンソースのメモリデータストレージシステムです。以下は、 mysqli_resultクエリの結果をRedisにキャッシュするための基本的な手順です。
まず、サーバーにRedisサービスをインストールする必要があります。インストール方法はオペレーティングシステムによって異なります。詳細なインストール手順については、 M66.net/redis -installationを参照できます。
PHPでRedisを使用するには、PHPのRedis拡張機能をインストールする必要があります。次のコマンドを介してインストールできます。
sudo pecl install redis
次に、 php.iniファイルでredis拡張機能を有効にします。
extension=redis.so
以下は、mysqlクエリの結果をRedisにキャッシュする方法を示す簡単な例です。
<?php
// 接続する MySQL データベース
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
// 检查接続する是否成功
if ($mysqli->connect_error) {
die('接続する失败: ' . $mysqli->connect_error);
}
// クエリキャッシュキー
$queryKey = 'my_query_result';
// 接続する Redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// から試してみてください Redis キャッシュされたデータを取得します
$cachedResult = $redis->get($queryKey);
if ($cachedResult) {
// もし Redis キャッシュ結果があります,直接返す
$result = unserialize($cachedResult);
echo 'から Redis データを取得します:';
} else {
// もし Redis キャッシュされた結果はありません,クエリとキャッシュの結果を実行します
$result = $mysqli->query('SELECT * FROM my_table');
// クエリの結果をシリアル化して保存します Redis
$redis->set($queryKey, serialize($result), 3600); // キャッシュの妥当性期間をに設定します 1 時間
echo 'から MySQL データを取得します:';
}
// クエリの結果を印刷します
while ($row = $result->fetch_assoc()) {
echo $row['column_name'] . "\n";
}
// 关闭接続する
$mysqli->close();
?>
この例では、最初にRedisからキャッシュされたクエリの結果を取得しようとします。 Redisにキャッシュデータがある場合は、直接使用してください。キャッシュされたデータがない場合は、クエリを実行して、Redisに結果を保存します。
特にデータが変更される可能性がある場合、キャッシュは永久に存在してはなりません。データの適時性を確保するために、キャッシュの有効期限を設定できます(上記の例では、3600秒、1時間です)。今回は、アプリケーションのニーズに応じて調整できます。
Redisを使用したくない場合は、ファイルシステムを使用してクエリ結果をキャッシュすることもできます。ファイルシステムキャッシュは、非常に高いアクセス速度を必要とせず、Redisよりも展開しやすいシナリオに適しています。
以下は、ファイルシステムに結果をクエリする方法をキャッシュする方法を示す簡単な例です。
<?php
// 接続する MySQL データベース
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
// 检查接続する是否成功
if ($mysqli->connect_error) {
die('接続する失败: ' . $mysqli->connect_error);
}
// キャッシュされたファイルパスをクエリします
$cacheFile = 'cache/my_query_result.cache';
// キャッシュファイルが存在し、有効期限が切れていないかどうかを確認します
if (file_exists($cacheFile) && filemtime($cacheFile) > (time() - 3600)) {
// もし缓存文件存在且未过期,ファイルコンテンツを読み取ります
$result = unserialize(file_get_contents($cacheFile));
echo 'から文件缓存データを取得します:';
} else {
// もし缓存文件不存在或已过期,クエリとキャッシュの結果を実行します到文件
$result = $mysqli->query('SELECT * FROM my_table');
// クエリの結果をファイルにシリアル化して保存します
file_put_contents($cacheFile, serialize($result));
echo 'から MySQL データを取得します:';
}
// クエリの結果を印刷します
while ($row = $result->fetch_assoc()) {
echo $row['column_name'] . "\n";
}
// 关闭接続する
$mysqli->close();
?>
この例では、クエリの結果をシリアル化し、それらをファイルに保存します。ファイルが存在し、有効期限が切れていない場合、ファイルからキャッシュされた結果を直接読み取ります。それ以外の場合は、クエリを実行して、結果をファイルに保存します。
Redisと同様に、ファイルシステムキャッシュを使用する場合、キャッシュの有効期限を設定する必要もあります。サンプルコードでは、 fileemtime関数がキャッシュされたファイルの最後の変更時間を決定し、データベースをリクエージする必要があるかどうかを判断します。
mysqli_resultクエリの結果をRedisまたはファイルシステムにキャッシュすることにより、PHPアプリケーションのパフォーマンスを大幅に改善し、データベースの負担を軽減できます。 Redisは、データが頻繁にアクセスされるシナリオにより適していますが、ファイルシステムキャッシュはアクセス頻度が少ないアプリケーションに適しています。選択するキャッシング方法は、アプリケーションのニーズと展開環境によって異なります。
Redisまたはファイルシステムのキャッシュを選択するかどうかにかかわらず、データの適時性と精度を確保するために、実際の状況に応じて合理的なキャッシュ故障時間を設定する必要があります。