PHPのAPCUキャッシュ拡張機能を使用する場合、開発者はしばしば2つの機能と接触します: APCU_ENTRY()とAPCU_ADD() 。これらはすべてキャッシュにデータを書き込むために使用されますが、動作と適用可能なシナリオには明らかな違いがあります。この記事では、実装の原則、使用シナリオ、パフォーマンスの観点から2つの違いを分析し、実際の例と組み合わせて説明します。
apcu_add(string $ key、mixed $ var、int $ ttl = 0):bool
この関数はキャッシュに値を追加し、指定された$キーが既に存在する場合、追加が失敗し、 falseが返されます。これは、 apcu_add()が「1回のみ追加」操作であり、避ける必要がある初期化またはシナリオによく使用されることを意味します。
APCU_ENTRY(String $ key、callable $ generator、int $ ttl = 0):混合
この関数は、キャッシュから$キーに対応する値を取得しようとします。キーが存在しない場合、 $ジェネレーターコールバック関数が呼び出され、データを生成してキャッシュに書き込みます。その典型的な目的は、繰り返し高価な操作を避けるために「怠zyな負荷」シナリオです。
キーが存在するかどうかを判断します。
apcu_add()はアトミックであり、直接追加しようとし、キーが既に存在している場合は返され、読み取りワイトレースを避けます。
APCU_ENTRY()は、最初に読み込もうとします。それが見逃した場合は、コールバックを生成して書き込みます。これにより、並行性の下での計算が繰り返される可能性があります(ただし、実際の発生の確率は低いです)。
動作を書く:
APCU_ADD()は既存の値を上書きすることはなく、「1回だけ」したい状況に適しています。
apcu_entry()は、キャッシュが存在しない場合に自動的に計算および書き込み、怠zyなロードに適しています。
シンプルさ:
APCU_ENTRY()は、より明確なカプセル化構造を提供し、コード実装の1行は、より明確なセマンティクスを使用して、無効にされたときに読み取り +生成ロジックをキャッシュします。
APCU_ADD()では、開発者が読み取りと判断のロジックを手動で記述する必要があります。
$config = [
'site_name' => 'GitBox',
'max_upload' => 100
];
$key = 'site_config';
if (!apcu_add($key, $config, 3600)) {
// すでに存在します,治療は行われていません
}
展開または初期化フェーズで記述された構成データに適しており、繰り返し設定または上書きされないようにします。
$data = apcu_entry('user_list', function() {
// この関数がデータベースをクエリすると仮定します
return file_get_contents('https://gitbox.net/api/users');
}, 600);
ここで、 user_listはデータを取得し、Access APIが存在しない場合にAccess APIを使用してキャッシュするため、頻繁に読み取られますが、時にはデータの変更に最適です。
シーン | apcu_add()を使用します | apcu_entry()を使用します |
---|---|---|
設定を初期化します | ? | ? |
カバレッジを避けてください | ? | ? |
自動的に生成されます | ? | ? |
怠zyなロード | ? | ? |
キャッシュロジックを簡素化します | ? | ? |
高い並行性環境では、 APCU_ENTRY()は便利ですが、その内部ロジックは強く一貫していません。複数のプロセスは、キーが存在しないことを同時に決定し、データを生成する場合があります。したがって、コールバックが高価であるか、結果が一意でなければならない場合は、ロックメカニズムを追加するか、 APCU_ADD()を使用して判断を支援することをお勧めします。
$key = 'report_2025';
if (!apcu_add($key, true, 300)) {
// タスクは別のプロセスで実行されています
return;
}
generateExpensiveReport(); // 1回実行してください
apcu_add()を使用することは、1回だけ書き込みを実行する場合に最適な選択です。
APCU_ENTRY()を使用することは、より効率的な方法を取得する方法であり、計算の結果を自動的にキャッシュします。
違いを理解することで、PHPのキャッシュロジックをより合理的に設計し、アプリケーションのパフォーマンスを改善し、リソースの消費を削減できます。