PHP を使用してブラウザのキャッシュを開く場合でも、Apache または iis サーバー環境を使用して設定する場合でも、ブラウザの Cache-Control に基づいて動作します。PHP で画像ブラウザのキャッシュを設定する方法を紹介します
Cache-。コントロール
キャッシュ制御は最も重要なルールです。このフィールドは、すべてのキャッシュ メカニズムが要求/応答チェーン全体で従う必要がある命令を指定するために使用されます。これらのディレクティブは、キャッシュによるリクエストや応答への悪影響を防ぐ動作を指定します。これらのディレクティブは通常、デフォルトのキャッシュ アルゴリズムをオーバーライドします。キャッシュ ディレクティブは一方向です。つまり、リクエストにディレクティブが存在しても、同じディレクティブが応答に存在するとは限りません。
キャッシュ制御の定義は次のとおりです: Cache-Control = "Cache-Control" ":" キャッシュ ディレクティブ。表 1 に適用可能な値を示します。
キャッシュディレクティブ | 手順 |
---|---|
公開 | すべてのコンテンツはキャッシュされます |
プライベート | コンテンツはプライベートキャッシュにのみキャッシュされます |
キャッシュなし | コンテンツはキャッシュされません |
無店舗 | キャッシュやインターネット一時ファイルにコンテンツはキャッシュされません |
必須再検証/プロキシ再検証 | キャッシュされたコンテンツが無効になった場合、再検証のためにリクエストをサーバー/プロキシに送信する必要があります |
max-age=xxx (xxx は数字) | キャッシュされたコンテンツは xxx 秒後に期限切れになります。このオプションは HTTP 1.1 でのみ使用でき、Last-Modified と一緒に使用すると優先度が高くなります |
クライアントがブラウザ経由で最初の URL リクエストを行うと、HTTP プロトコルの規定に従って、ブラウザはヘッダー (HTTP リクエスト ヘッダー) をサーバーに送信し、サーバーはそれに応答して関連する属性タグを記録します。 (HTTP 応答ヘッダー)。サーバーからの戻りステータスは 200 で、次のような形式になります:
コードは次のとおりです | コードをコピー |
HTTP/1.1 200 OK |
クライアントがこの URL を 2 度目にリクエストすると、HTTP プロトコルの規定に従って、ブラウザはサーバーにヘッダー (Http リクエスト ヘッダー) を送信し、サーバーはそれに応答し、関連するレコード属性タグ ファイルが作成されていないことを記録します。サーバーは、キャッシュからの読み取りから直接 304 を返します:
コードは次のとおりです | コードをコピー |
HTTP/1.x 304 は変更されていません |
1. Last-Modified、Expires、Etag に関連する動作原則
1.最終更新日
ブラウザが初めて URL をリクエストしたとき、サーバーから返されるステータスは 200 です。コンテンツはリクエストしたリソースであり、Last-Modified 属性マーク (このファイルの最終更新日時) があります。サービス終了時間と形式は次のようになります:
1 最終更新日: 火曜日、2009 年 2 月 24 日 08:01:04 GMT
クライアントがこの URL を 2 度目にリクエストすると、HTTP プロトコルの規定に従って、ブラウザは If-Modified-Since ヘッダー (HTTP リクエスト ヘッダー) をサーバーに送信して、この時点以降にファイルが変更されたかどうかを尋ねます。 :
1 If-Modified-From: 火曜日、2009 年 2 月 24 日 08:01:04 GMT
サーバー側のリソースが変更されていない場合、HTTP 304 (Not Changed.) ステータス コードが空の内容で自動的に返されるため、送信されるデータ量が節約されます。サーバー側のコードが変更されるか、サーバーが再起動されると、リソースが再発行され、最初のリクエストと同様のものが返されます。これにより、リソースがクライアントに繰り返し送信されなくなり、サーバーが変更されたときにクライアントが最新のリソースを取得できるようになります。
注: If-Modified-Since の時刻がサーバーの現在時刻 (現在のリクエスト時刻 request_time) より遅い場合、不正なリクエストとみなされます
2. Etagの動作原理
HTTP プロトコル仕様では、ETag を「要求された変数のエンティティ タグ」として定義しています (14.19 を参照)。
簡単なことは、サーバーが応答するときにリクエスト URL をマークし、それをサーバーから返される形式と同様の HTTP 応答ヘッダーでクライアントに送信することです。
1 Eタグ: “5d8c72a5edda8d6a:3239”
クライアントのクエリ更新形式は次のとおりです:
ETag が変更されていない場合は、ステータス 304 が返されます。
つまり、クライアントがリクエストを行った後、HTTP レスポンス ヘッダーには Etag: “5d8c72a5edda8d6a:3239”
が含まれます。
この識別子は、取得したリソースの ID が 5d8c72a5edda8d6a:3239 であることをクライアントに伝えるのと同じです。
None 一致の場合 1 件: 「5d8c72a5edda8d6a:3239」
このようにして、クライアント側は 2 つのコピーをキャッシュし、サーバー側は 2 つの etag を比較します。 If-None-Match が False の場合、200 は返されませんが、304 (Not Modified) 応答が返されます。
指定された日付/時刻を過ぎると、応答は古いとみなされます。有効期限など: 2009 年 4 月 2 日木 05:14:08 GMT
Last-Modified と組み合わせて使用する必要があります。リクエストされたファイルの有効期限を制御するために使用され、リクエストされたデータが有効期間内である場合、クライアントのブラウザは、キャッシュ内のデータが無効または期限切れの場合に、サーバーの代わりにキャッシュにデータをリクエストします。サーバーからのデータ。
Last-Modified フラグは帯域幅を少し節約できますが、HTTP リクエストの送信から逃れることはできないため、Expires と併用する必要があります。 Expires フラグを使用すると、たとえば、ユーザーが F5 キーを押すか [更新] ボタンをクリックした場合でも、Expires を持つ URI に対しても HTTP リクエストが送信されなくなります。したがって、Last-Modified が必要になります。を使用し、Expires と一緒に使用する必要があります。
Etag と Expires の両方がサーバー側で設定されている場合、Etag の原理は同じです。つまり、Last-Modified/Etag に対応する Http リクエスト ヘッダー: If-Modified-Since および If-None-Match です。これら 2 つのヘッダーの値は、Web サーバーによって送信された Last-Modified 値と Etag 値とまったく同じであることがわかります。サーバーは、If-Modified-Since と If-None- が完全に一致した場合にのみ返されます。つまり、変更時刻と Etag を確認した後に一致します。
Last-Modified は ETags リクエストの http ヘッダーと一緒に使用され、サーバーは最初に Last-Modified/Etag タグを生成して、ページが変更されたかどうかを判断し、ファイルを継続するかどうかを決定します。キャッシュされました
1. クライアントはページを要求します (A)。
2. サーバーはページ A を返し、Last-Modified/ETag を A に追加します。
3. クライアントはページを表示し、Last-Modified/ETag とともにページをキャッシュします。
4. クライアントはページ A を再度リクエストし、最後のリクエスト中にサーバーから返された Last-Modified/ETag をサーバーに渡します。
5. サーバーは Last-Modified または ETag をチェックし、最後のクライアント要求以降ページが変更されていないと判断し、応答 304 と空の応答本文を直接返します。
1. Last-Modified ヘッダーと Etag ヘッダーは両方とも Web サーバーによって発行される Http 応答ヘッダーです。Web サーバーは両方のヘッダーを同時にサポートする必要があります。
2. Web サーバーが Last-Modified/Etag ヘッダーをクライアントに送信した後、クライアントはこれらのヘッダーをキャッシュします。
3. クライアントが同じページに対するリクエストを再度開始すると、HTTP リクエスト ヘッダー、つまり Last-Modified/Etag にそれぞれ対応する If-Modified-Since および If-None-Match が送信されます。これら 2 つのヘッダーの値は、Web サーバーによって送信された Last-Modified および Etag の値とまったく同じであることがわかります。
4. 上記の値を使用してサーバー側でファイルがキャッシュされ続けるかどうかを確認します
;
2. 非リアルタイムのインタラクティブな動的ページでの Epires と Etag の処理
タグの分類やアーカイブなど、頻繁に更新されないデータの場合は、キャッシュすることを検討できます。簡単なポイントは、非リアルタイムの対話型動的プログラムで有効期限と etag 識別子を出力し、それらをキャッシュさせることです。 ただし、http ヘッダーに http 応答のセッション ID が含まれないように、セッションを閉じることに注意する必要があります。
例:expires.php
コードをコピー | |
header('キャッシュ制御: max-age=86400,must-revalidate');
header('Last-Modified: ‘ .gmdate(’D, d M Y H:i:s’) . ‘ GMT’ );
header(”有効期限: ” .gmdate (’D, d M Y H:i:s’, time() + ‘86400’ ). ‘ GMT’);
|
etag.phpなど
{
$etag = “http://longrujun.name”;
If (isset($_SERVER['HTTP_IF_NONE_MATCH']) && |
$imagePath = "パス/画像へのパス"; | $eTag = $imagePath; $eTag .= ファイルMTime($imagePath); $eTag = md5($eTag);if((isset($_SERVER['HTTP_IF_NONE_MATCH'])) && | (ストリップスラッシュ($_SERVER['HTTP_IF_NONE_MATCH']) == $eTag)) {||||
header("ETag: ".$eTag);
header("Content-Type: image/png");
readFile($imagePath);
exit();
上記の方法は非常に簡単です。以下の完全な例を参照してください
| http://www.bkjia.com/PHPjc/631550.html
php を使用してブラウザのキャッシュを開く場合でも、Apache または iis サーバー環境を使用して設定する場合でも、ブラウザの Cache-Control に基づいて動作します...