1

PHP でのキャッシュに関する同様の質問を見てきましたが、データベースに新しい呼び出しを行わずにデータベースが変更されたかどうかを確認する方法についてはまだ困惑しています。

PHP でキャッシングを実装する方法を技術的に理解しています- ETag と Last Modified ヘッダーの使用、出力バッファリング、静的ファイルの保存など。バージョン。データベースのコンテンツが変更された場合、キャッシュされたバージョンではなく、新しいバージョンを表示したいと考えています。

たとえば、製品に関する詳細を表示するページがあるとします。通常、製品情報がデータベースに保存されると、あまり変更されません。ただし、商品説明の編集や価格の変更がある場合があります。製品に新しい価格がある場合、ページのキャッシュ バージョンを使用して古い価格をユーザーに表示したくありません。そのため、キャッシュされたコンテンツを 1 時間ごとに更新するだけでは十分ではないようです。変更されていないコンテンツの場合、これが頻繁に行われることは言うまでもありませんが、実際の問題は、変更があった場合にコンテンツが十分に速く更新されないことです。

アプリケーションの管理領域のフォームから製品データベースが更新されるたびに、何か (ETag 値や静的 html ファイルなど) を保存する必要がありますか? ここで何が欠けていますか?

[注: ここでキャッシング ライブラリを使用することに興味はありません。今のところ、ストレートPHPでそれを行う方法を学びたいと思います。]

4

2 に答える 2

2

あらゆる種類のデータをさまざまな場所にキャッシュできるため、キャッシュは非常に複雑なトピックです。通常、サーバー構造のボトルネックを解消するためにキャッシュを実装します。

セットアップでは、次の3つの異なる場所にデータをキャッシュできます。

1)クライアント側、クライアントとサーバー間この方法を使用して、帯域幅を節約し、ユーザーの読み込み時間を短縮します。これを実現するには、キャッシュ関連のフィールドをhttpヘッダー(Cache-Control、Expires、ETagなど)に設定します。

Cache-ControlまたはExpiresを使用する場合、サーバーから更新されたバージョンをロードするかどうかの決定は、純粋にクライアントに依存します。したがって、新しいバージョンが利用可能であっても、ユーザーには表示されません。プラス面としては、phpスクリプトが実行されないため、サーバーで多くのCPUサイクルを節約できます。

ETagを使用する場合、要求されたコンテンツのバージョンが変更されているかどうかを、要求ごとにクライアントに通知できます。ただし、ETagが変更されていない場合でも、phpスクリプトはリクエストごとに実行されます。

2)サーバー側、クライアントとサーバー間この種のキャッシュは、主にサーバーの高いCPU負荷を軽減します。クライアントとサーバー間で生成されるトラフィックの量には影響しません。

Varnishなどのクライアントプロキシを使用して、レンダリングされた応答をサーバー側に保存できます。良い点は、キャッシュを完全に制御できることです。要求されたコンテンツの更新バージョンが利用可能な場合は、古いバージョンをキャッシュから削除するだけで、新しいバージョンがphpスクリプトから生成され、キャッシュに保存されます。

キャッシュ可能なすべての応答は1回だけ生成され、キャッシュからクライアントに提供されます。

3)アプリケーションでデータベースを頻繁に使用している場合は、クエリ結果をキャッシュするためにmemcachedなどの高速キー値ストアの使用を検討する必要があります。もちろん、これに合わせてデータベースクラスを調整する必要があります(memcachedに結果がない場合は、最初にmemcachedに問い合わせて、結果をmemcachedに保存します)が、memcachedは非常に高速であるため、パフォーマンスの向上は非常に印象的です。

データを永続的に永続化する必要がない場合(たとえば、phpセッション)、データをmemcachedにのみ保存することが理にかなっている場合もあります。

于 2012-05-23T20:07:23.857 に答える
0

私もずっと前に同じ問題に直面していました(あなたが私の正しい方法を見つけるかどうかはわかりません)。

キャッシュが必要な理由:- 私のサイトで使用しているのは、cron.phpファイルでスクリプトを実行してデータベースを更新するために使用し、index.phpを使用してデータベースからのリストを表示するためです(これはロードに時間がかかるためです)

私の解決策:-

新しいリストが作成または更新されるたびに、キャッシュファイルのリンクを解除し、index.phpページで、キャッシュファイルが存在するかどうかを確認しました。キャッシュをロードするか、データベースからコンテンツをロードすると同時に、このデータをキャッシュファイルに書き込みます。 index.phpファイルに対するユーザーの要求

于 2013-01-20T18:28:23.233 に答える