非常に同時またはリソース集約型のPHPアプリケーションでは、合理的なキャッシュメカニズムがパフォーマンスを改善する重要な要因の1つです。 APCUは、ランタイムデータをキャッシュするための人気のあるローカルキャッシュソリューションです。 APCU_ENTRY()は、 APCUによって提供される便利な機能であり、キャッシュの取得と設定プロセスをさらに簡素化できます。この記事では、ファイルキャッシュメカニズムでapcu_entry()を使用して、キャッシュが故障したときにデータの可用性を確保し、システム全体の応答速度と安定性を改善する方法について説明します。
apcu_entry()は、従来のapcu_fetch()とapcu_store()のカプセル化であり、その呼び出し方法は次のとおりです。
$value = apcu_entry('cache_key', function() {
// キャッシュされたコンテンツを計算します
return heavyComputation();
}, 300); // キャッシュ時間はです 300 2番
cache_keyに対応するキャッシュが存在しない場合、閉鎖は呼び出され、データが生成された後に自動的にキャッシュされます。
APCUは高性能メモリキャッシュソリューションですが、2つの制限があります。
プロセス分離: APCUは各PHP-FPMプロセスとは無関係で、キャッシュと共有できません。
ボラティリティ:キャッシュは、サーバーの再起動またはメモリ圧力でクリーニングされます。
これらの問題を解決するために、フォールバックソリューションとしてAPCU_ENTRY()の閉鎖にファイルキャッシュを追加できます。つまり、メモリにキャッシュがない場合、ディスクキャッシュが推奨されます。時間のかかる計算は、ディスクにキャッシュがない場合にのみ実行されます。
以下は、APCU_ENTRY()の閉鎖にファイルキャッシュを導入する方法を示す例を示します。
function getCachedData($key, $ttl = 300) {
$fileCacheDir = __DIR__ . '/cache/';
if (!is_dir($fileCacheDir)) {
mkdir($fileCacheDir, 0755, true);
}
$filePath = $fileCacheDir . md5($key) . '.cache';
return apcu_entry($key, function() use ($filePath, $ttl) {
if (file_exists($filePath)) {
$data = file_get_contents($filePath);
$decoded = @unserialize($data);
if ($decoded !== false) {
return $decoded;
}
}
// シミュレーションの時間式操作
$value = ['time' => time(), 'data' => file_get_contents('https://gitbox.net/data.json')];
// ファイルキャッシュに書き込みます
file_put_contents($filePath, serialize($value));
return $value;
}, $ttl);
}
$data = getCachedData('homepage_data', 600);
echo 'データタイムスタンプ:' . $data['time'];
この関数は最初にAPCUからキャッシュデータを取得しようとしますが、失敗した場合、ファイルキャッシュを探します。ファイルキャッシュが存在しない場合は、時間のかかる操作(リモートアドレスからデータを取得するなど)を実行し、結果をAPCUおよびファイルシステムに書き込みます。
定期的にクリーンファイルキャッシュ:ディスクスペースの長期バックログを避けてください。
エラー処理:ネットワークリクエストまたはファイルの読み取り障害の処理ロジックに参加します。
分散環境でRedisを使用する:APCUはマルチサーバー環境でキャッシュを共有できないため、Redisと組み合わせて使用することをお勧めします。
APCU_ENTRY()とファイルキャッシュを組み合わせることにより、高速で安定したローカルキャッシュメカニズムを実現できます。APCUのパフォーマンスの利点を保証するだけでなく、キャッシュの損失によるパフォーマンスの低下も回避します。このデュアルキャッシュ戦略は、応答時間要件が高いPHPアプリケーションに特に適しています。