2012-05-15 19 views
14

私の質問はかなりカジュアルだと思うが、面白い(少なくとも私にとっては:) :)。PHPで動的に作成されたHTTP応答のキャッシュ

ファイルシステムから要求されたファイルを読み込み、それを応答としてエコーすることを目的としたPHPページを考えてみましょう。今質問は、このページのキャッシュを有効にする方法ですか?重要な点は、ファイルがかなり大きくなる可能性があり、キャッシュを有効にすることは、クライアントが同じコンテンツを繰り返しダウンロードするのを防ぐことです。

理想的な戦略は、リバースプロキシキャッシュシステムを実装するために、「If-None-Match」要求ヘッダーと「ETag」応答ヘッダーを使用することです。私はこれまでのことを知っていますが、これが可能かどうか、あるいはこのテクニックを実装するために私が返答として何を返すべきかはわかりません!

+0

クールアイ。しかし、まだ私のために一致しません。 –

+0

この眼の所有者は今JuubiのJinchuurikiです、確かにしないでください! – Mehran

+0

今のところ、私のトランプカードはまだ明らかにされていません。 [アニメ&マンガチャット](http://chat.stackexchange.com/rooms/6697/anime-and-manga)でこのチャットを続けましょう。このスレッドを混乱させないために。 –

答えて

25

PHPで膨大な数の補助ファイルを提供することは、まさにそのためのものではありません。

代わりに、nginxの場合はX-accel、Lighttpdの場合はX-Sendfile、Apacheの場合はmod_xsendfileをご覧ください。

最初のリクエストはPHPによって処理されますが、ダウンロードファイルが決定されると、サーバーがファイル送信を処理することを示すいくつかのヘッダーが設定されます。その後、PHPプロセスが解放されて別のサービスが提供されます。

次に、Webサーバーを使用してキャッシュを構成できます。

静的コンテンツは、PHPから生成し、作成することは特に高価されている場合は、ローカルファイルに出力を書き込み、再び上記の方法を適用することができ、コンテンツ

を生成。

ローカルファイルへの書き込みができないか、あなたはキャッシュを制御するためにHTTPレスポンスヘッダを使用することができますしたくない場合は、次の

Expires: <absolute date in the future> 
Cache-Control: public, max-age=<relative time in seconds since request> 

これは期限が切れるまで、クライアントがページの内容をキャッシュするようになりますユーザーがページの再読み込みを強制したとき(F5キーを押すなど)動的動的なコンテンツのコンテンツ

を生成

あなたはブラウザがあなたにするたびにpingを実行したいのですが、何か新しいものがあります場合にのみページの内容を送信します。主に低減させるために使用される

If-None-Match: <hash of the contents that you sent last time> 
If-Modified-Since: <absolute date of last contents change> 

ETagを:ブラウザがもう一度スクリプトをpingし

ETag: <hash of the contents> 
Last-Modified: <absolute date of last contents change> 

、彼らはそれぞれ以下のリクエストヘッダを追加します:あなたは、いくつかの他のレスポンスヘッダを設定することによって、これを達成することができます場合によってはコンテンツのハッシュを知るために、ネットワークトラフィックを計算する必要があります。

Last-Modifiedは、ローカルファイルキャッシュ(ファイルに変更日がある場合)を適用するのが最も簡単です。簡単な条件は、それが動作します:

if (!file_exists('cache.txt') || 
    filemtime('cache.txt') > strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { 
    // update cache file and send back contents as usual (+ cache headers) 
} else { 
    header('HTTP/1.0 304 Not modified'); 
} 

ファイルのキャッシュを行うことができない場合、あなたはまだ内容がその間に変更されたかどうかを判断するためにETagを使用することができます。

+0

私が言いたいことを忘れてしまったのは間違いですが、PHPを削除することは不可能です。 PHP内に複雑なロジックが存在する可能性があります。 – Mehran

+0

@MehranZiadlooあなたは私の答えを得られなかったかもしれない、私はそれを改めた。 –

+0

あなたの更新があなたの意見を明確にしましたが、コンテンツが読み込まれるのではなく生成されるため、PHPを削除することはまだ不可能です。とにかくありがとう。 – Mehran

関連する問題