現在の位置: ホーム> 最新記事一覧> APCU_ENTRYのキャッシュの有効期限によって引き起こされるパフォーマンスの問題を回避する方法

APCU_ENTRYのキャッシュの有効期限によって引き起こされるパフォーマンスの問題を回避する方法

gitbox 2025-05-20

同時のPHPアプリケーションが高い場合、キャッシュの合理的な使用は、パフォーマンスを改善するための重要な手段です。 APCUは、スタンドアロン環境での中間データキャッシュに適したメモリレベルのキャッシュです。迅速な応答で使いやすいです。ただし、キャッシュのライフサイクルも制限されており、データの有効期限が切れるかクリアされると、不適切に処理された場合、雪崩または瞬時の同時実行ボトルネックにつながる可能性があります。

この記事では、 apcu_entry()関数を使用する方法を紹介し、キャッシュの有効期限が切れたときに発生する可能性のあるパフォーマンスの問題をエレガントに解決するために使用する方法を探ります。

apcu_entryはじめに

APCU_ENTRY()はPHP 5.5+で導入された関数であり、その機能は次のとおりです。

  • キャッシュからキー値を取得してみてください。

  • それが存在しない場合、キャッシュは、提供されたコールバック関数を使用して計算および記述されます。

  • キャッシュされた値を返します。

基本的な構文は次のとおりです。

 mixed apcu_entry(string $key, callable $callback, int $ttl = 0)
  • $キー:キャッシュキー。

  • $ callback :キャッシュが存在しないときに実行される関数は、値を生成するために使用されます。

  • $ TTL :キャッシュの有効な時間(秒)、デフォルト0は永続的に有効なことを意味します(メモリがクリアされるか、スクリプトが終了するまで)。

キャッシュの内訳を避けるためのエレガントな方法

いわゆる「キャッシュブレークダウン」とは、ホットスポットキャッシュされたデータが失効し、多くの同時リクエストがキャッシュをバイパスし、バックエンドリソースを直接要求して、サーバー圧力が突然増加するという事実を指します。

従来の方法は次のとおりです。

 $key = 'user_profile_123';
$data = apcu_fetch($key);
if ($data === false) {
    $data = get_user_profile_from_db(123); // データベースからのクエリ
    apcu_store($key, $data, 300);          // キャッシュ 5 分
}

問題は、キャッシュがたまたま失敗した場合、多数の要求が同時にget_user_profile_from_db()を実行し、データベースを破壊する可能性があることです。

およびapcu_entry()は次のように処理できます。

 $userId = 123;
$key = "user_profile_$userId";

$data = apcu_entry($key, function() use ($userId) {
    // ここでは1つのリクエストのみが実行されます,其他请求会等待结果キャッシュ后直接获取
    return get_user_profile_from_db($userId);
}, 300); // キャッシュ 5 分

これを行うことの利点は次のとおりです。

  • 複数のリクエストを回避するための原子操作は、同時に遅いクエリをトリガーします。

  • 使いやすく、より明確なロジック。

  • 組み込みの「ブレークダウン」メカニズム、追加のロックは必要ありません。

実用的な例:キャッシュインターフェイスコール結果

たとえば、頻繁に呼ばれるインターフェイスがあるとします。

 https://api.gitbox.net/weather?city=shanghai

通話の頻度を減らすために、結果を60秒間キャッシュします。 apcu_entry()を使用して書き込みます。

 $city = 'shanghai';
$key = "weather_api_result_$city";

$result = apcu_entry($key, function() use ($city) {
    $url = "https://api.gitbox.net/weather?city=$city";
    $json = file_get_contents($url);
    return json_decode($json, true);
}, 60);

このようにして、キャッシュが失敗すると、1つの要求のみが実際にインターフェイスにアクセスし、他のリクエストがキャッシュが完了して結果を共有するのを待ち、外部リクエストへの圧力を大幅に削減します。

注意すべきこと

  1. 適用可能なシナリオ:APCUは、CLIモードを除くスタンドアロン環境に適しており、マルチプロセスまたは分散システムには適していません。

  2. キャッシュ貫通APCU_ENTRY()は、キャッシュの侵入を解きません(つまり、キャッシュに存在しないデータの繰り返しの要求)。結果がコールバックでnullであるかどうかを判断し、それを書くかどうかを決定できます。

  3. 障害制御:頻繁なキャッシュ障害と過度のメモリ使用量を避けるために、TTLを合理的に設定します。

  4. 例外処理:キャッシュプロセスの例外の中断を防ぐために、内部的に例外キャッチを行うことをお勧めします。

要約します

APCU_ENTRY()を使用することは、特にホットスポットデータと高い同時アクセスを処理する場合、PHP開発者がマスターする必要があるエレガントなキャッシング戦略です。これにより、キャッシュロジックは、最新のPHPアプリケーションのパフォーマンスの最適化ニーズにより、よりシンプルで信頼性が高くなり、より適しています。

高性能Webアプリケーションを構築する過程で、 APCU_ENTRY()の合理的な使用は、応答速度とシステムの安定性を改善するためのツールになります。