PHPアプリケーションの開発では、キャッシュはパフォーマンスと応答速度を改善するための重要な手段です。 APCU(代替PHPキャッシュユーザー)は、頻繁なディスクIOまたはデータベースクエリを回避して、共有メモリにデータを直接保存できる軽量で効率的なユーザーデータキャッシュソリューションです。
APCUが提供する多くの機能の中で、 APCU_ENTRYとAPCU_FETCHは、非常に重要で一般的に使用される2つの機能です。これら2つの機能を合理的に使用すると、キャッシュの効率とコードのシンプルさを大幅に改善できます。
APCU_Entryは、原子的な方法でキャッシュされたものを書いて読むことができる比較的新しい機能です。その構文は次のとおりです。
mixed apcu_entry(string $key, callable $generator, int $ttl = 0)
この関数の動作の原則は次のとおりです。指定されたキー$キーがキャッシュに存在する場合、対応する値が直接返されます。それが存在しない場合、 $ジェネレーターコールバック関数が呼び出されてデータを生成し、データがキャッシュに書き込んだ後に返されます。このメカニズムは、同時環境での「衝撃効果」の発生を防ぎます(つまり、複数の要求は同じキャッシュコンテンツを同時に生成しようとします)。
$data = apcu_entry('user_list', function() {
// これが非常に高価なデータベースクエリであると仮定します
return file_get_contents('https://api.gitbox.net/users');
}, 300); // キャッシュ 5 分
上記のコードは、 user_listキャッシュが存在しない場合、ユーザーデータがリモートインターフェイスから取得され、300秒間キャッシュされることを意味します。
APCU_ENTRYと比較して、 APCU_FETCHは軽量です。コールバックを生成する機能なしで、キャッシュからデータを取得するためにのみ使用されます。次のように使用されます。
mixed apcu_fetch(string $key, bool &$success = null)
2番目のパラメーター$の成功により、買収が成功したかどうかを判断できます。
$success = false;
$data = apcu_fetch('config_data', $success);
if (!$success) {
// キャッシュ失效,再生
$data = file_get_contents('https://config.gitbox.net/settings');
apcu_store('config_data', $data, 600);
}
APCU_ENTRYとAPCU_FETCHの機能は重複していますが、実際の開発では、合理的な使用により、コードの柔軟性と明確さが向上します。一致するいくつかの推奨方法は次のとおりです。
存在しなければならない重要なキャッシュ(データの大きなバッチ、インターフェイスコール結果など)の場合、 APCU_Entryを使用することをお勧めします。これは原子であり、キャッシュの繰り返しの生成を避けることができるためです。
$articleList = apcu_entry('home_articles', function() {
return file_get_contents('https://news.gitbox.net/api/articles');
}, 120);
強力なオプション(構成データ、ユーザー設定など)のキャッシュの場合、最初にAPCU_FETCHを使用してキャッシュヒットをすばやく検出し、キャッシュを更新するかどうかを決定できます。
$success = false;
$theme = apcu_fetch('user_theme_' . $userId, $success);
if (!$success) {
$theme = getUserThemeFromDb($userId);
apcu_store('user_theme_' . $userId, $theme, 3600);
}
APCU_Entryを一般的な方法にカプセル化して、ビジネスコードをより簡潔にすることができます。
function cache_remember($key, callable $callback, $ttl = 300) {
return apcu_entry($key, $callback, $ttl);
}
// 使用の例
$config = cache_remember('site_config', function() {
return file_get_contents('https://config.gitbox.net/v2');
});
APCU_ENTRYとAPCU_FETCHを合理的に使用することにより、キャッシュの読み取りと更新を効率的に実行するだけでなく、同時環境で繰り返し計算問題を避けることもできます。選択する関数は、タイプ、キャッシュデータの重要性、および更新戦略によって異なります。これら2つの使用パターンをマスターすることは、高性能PHPアプリケーションを構築する上で重要な部分です。