predefined URLs
次の方法に応じてリクエストをルーティングするアプリケーションがあります。
第 1 ステップ: キャッシュ ルックアップ
すべてURLS
が 1 つに集約されarray
(シリアル化され、キャッシュに格納されます)、その構造は次のとおりです。
- それぞれ
array key
がURL
- 情報 (つまり、
URL
をどうするかURL
) は、対応する として定義されarray value
ます。
実際には、これにより(FYIPHP 5.4
配列構文) が得られます。
<?php
// structure of the cached URLS array
$cached_urls = [
'/pageA' => [
'controller' => 'ProductController',
'content_id' => 1234
],
'/serviceA' => [
'controller' => 'ServiceController',
'content_id' => 45678
]
];
// working with the array (retrieve $cached_urls from cache, then...)
if (!isset($cached_urls[$request['url']])) {
// 404
} else {
$url = $cached_urls[$request['url']];
// further actions based on $url
}
2 番目のステップ:配列をキャッシュから取得できなかっ
た場合のDB ルックアップとキャッシュの再構築3 つのことを行います。$cached_urls
- テーブル (それぞれが表し、それ自体がクエリのフィルター処理に使用されるフィールド) およびその他の関連テーブル
URL
から情報を取得します。url
row
1 URL
URL
- キャッシュ シナリオと同じ方法でリクエストを処理します。
$url
- キャッシュを再構築して、次回リクエストが来たときに DB ルックアップを行う必要がないようにします。
実行速度に関しては、次のとおりです (速い方から遅い方へ)。
- キャッシュ ルックアップ ( ~10ms)
- DB ルックアップ ( ~100ms)
- キャッシュの再構築 (~2000ms)
キャッシュが利用可能な場合、ページは非常に高速に提供されますが、キャッシュが再構築されるたびに (約 1 分ごと)、ページが提供されるまでに数秒かかるため、問題が発生します。したがって、私は疑問に思っていました:
同じタスクを同時に複数回実行することを避けながら非同期処理を実行するために PHP で利用可能な設計パターンは何ですか (私の場合はキャッシュを再構築するために使用されます) (一度にキャッシュを再構築する必要があるだけなので)その間、アプリケーションにヒットするすべてのリクエストではなく、再構築されるまで)?