PHP開発では、 APCU_EntryはAPCUキャッシュのキーの値を取得するために使用される効率的な関数であり、それが存在しない場合、コールバック関数を介して生成され、キャッシュに書き込まれます。ただし、高い並行性または長期にわたるスクリプトでは、 APCU_Entryが依存するキャッシュ項目が期限切れになり、頻繁なキャッシュの再構築を引き起こし、パフォーマンスの問題を引き起こします。この記事では、 APCU_Entryキャッシュの有効期限の問題をより適切に管理できるように、いくつかの一般的な対処戦略を紹介します。
APCU_Entryの基本的な使用法は次のとおりです。
$value = apcu_entry('my_key', function() {
return heavyComputation();
}, 300); // キャッシュ 300 2番
「my_key」が存在しない場合、コールバック関数が実行され、返された値は300秒間キャッシュされます。問題は、キャッシュアイテムが同時性の高い状況で同時に期限切れになると、複数のリクエストが同時にコールバック関数をトリガーし、リソースの無駄をもたらす可能性があることです。
キャッシュの内訳とは、複数の同時要求がデータベースに同時にアクセスするか、キャッシュアイテムが故障したときにハイオーバーヘッド操作を実行し、パフォーマンスボトルネックを引き起こすという事実を指します。ファイルロック、 APCU_ADD 、またはMutexロックを使用して回避できます。
以下は、 APCU_ADDを使用して実装されたロックメカニズムです。
$key = 'my_key';
$lockKey = $key . '_lock';
$value = apcu_fetch($key, $success);
if (!$success) {
if (apcu_add($lockKey, 1, 10)) {
// 現在の要求はビルド権を取得します
$value = heavyComputation();
apcu_store($key, $value, 300);
apcu_delete($lockKey);
} else {
// 待って其他进程构建キャッシュ
usleep(50000); // 待って 50ms
$value = apcu_fetch($key);
}
}
頻繁にアクセスされる重要なデータの場合、キャッシュ時間に拡張できます。また、バックエンドタスクは、キャッシュが期限切れになる前にキャッシュ(キャッシュウォームアップ)を積極的に更新して、更新をトリガーするためのユーザー要求を避けることができます。
// 后台定时脚本预热キャッシュ
$value = heavyComputation();
apcu_store('my_key', $value, 300);
APCUのキャッシュが無効または利用できない場合、ファイルキャッシュ、Redis、またはデータベースをスタンバイとして使用できます。例えば:
$key = 'my_key';
$value = apcu_fetch($key, $success);
if (!$success) {
$value = file_get_contents('/tmp/cache_my_key.json');
if (!$value) {
$value = heavyComputation();
apcu_store($key, $value, 300);
file_put_contents('/tmp/cache_my_key.json', $value);
}
}
APCU_CACHE_INFO()およびAPCU_SMA_INFO()を使用して、キャッシュのヒット率とメモリ使用量を表示し、それによりキャッシュ戦略を調整します。
print_r(apcu_cache_info());
print_r(apcu_sma_info());
さらに、キャッシュシステムの安定した動作を確保するために、展開中にAPCU管理ページを有効にすることをお勧めします。
http://gitbox.net/apc.php
APCU_Entry関数の合理的な使用は、アプリケーションのパフォーマンスを大幅に改善できますが、期限切れの問題に対処するために適切なキャッシュ戦略と組み合わせる必要があります。メカニズムのロック、キャッシュの予熱、バックアップソリューション、およびその他の手段により、キャッシュの内訳とパフォーマンスボトルネックを効果的に回避し、PHPアプリケーションをより安定して効率的にします。