ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルで画像ブラウザーのキャッシュを設定する方法の概要

PHP_PHP チュートリアルで画像ブラウザーのキャッシュを設定する方法の概要

WBOY
WBOYオリジナル
2016-07-13 16:57:141075ブラウズ

PHP を使用してブラウザのキャッシュを開く場合でも、Apache または iis サーバー環境を使用して設定する場合でも、ブラウザの Cache-Control に基づいて動作します。PHP で画像ブラウザのキャッシュを設定する方法を紹介します

Cache-。コントロール

キャッシュ制御は最も重要なルールです。このフィールドは、すべてのキャッシュ メカニズムが要求/応答チェーン全体で従う必要がある命令を指定するために使用されます。これらのディレクティブは、キャッシュによるリクエストや応答への悪影響を防ぐ動作を指定します。これらのディレクティブは通常、デフォルトのキャッシュ アルゴリズムをオーバーライドします。キャッシュ ディレクティブは一方向です。つまり、リクエストにディレクティブが存在しても、同じディレクティブが応答に存在するとは限りません。

キャッシュ制御の定義は次のとおりです: Cache-Control = "Cache-Control" ":" キャッシュ ディレクティブ。表 1 に適用可能な値を示します。

表 1. 一般的に使用されるキャッシュ ディレクティブの値
キャッシュディレクティブ 手順
公開 すべてのコンテンツはキャッシュされます
プライベート コンテンツはプライベートキャッシュにのみキャッシュされます
キャッシュなし コンテンツはキャッシュされません
無店舗 キャッシュやインターネット一時ファイルにコンテンツはキャッシュされません
必須再検証/プロキシ再検証 キャッシュされたコンテンツが無効になった場合、再検証のためにリクエストをサーバー/プロキシに送信する必要があります
max-age=xxx (xxx は数字) キャッシュされたコンテンツは xxx 秒後に期限切れになります。このオプションは HTTP 1.1 でのみ使用でき、Last-Modified と一緒に使用すると優先度が高くなります

クライアントがブラウザ経由で最初の URL リクエストを行うと、HTTP プロトコルの規定に従って、ブラウザはヘッダー (HTTP リクエスト ヘッダー) をサーバーに送信し、サーバーはそれに応答して関連する属性タグを記録します。 (HTTP 応答ヘッダー)。サーバーからの戻りステータスは 200 で、次のような形式になります:

コードは次のとおりです コードをコピー

HTTP/1.1 200 OK
日付: 2009 年 3 月 3 日火曜日 04:58:40 GMT
コンテンツタイプ: 画像/jpeg
コンテンツの長さ: 83185
最終更新日: 2009 年 2 月 24 日火曜日 08:01:04 GMT
キャッシュ制御: max-age=2592000
有効期限: 2009 年 4 月 2 日(木) 05:14:08 GMT
Eタグ: 「5d8c72a5edda8d6a:3239」


クライアントがこの URL を 2 度目にリクエストすると、HTTP プロトコルの規定に従って、ブラウザはサーバーにヘッダー (Http リクエスト ヘッダー) を送信し、サーバーはそれに応答し、関連するレコード属性タグ ファイルが作成されていないことを記録します。サーバーは、キャッシュからの読み取りから直接 304 を返します:

コードは次のとおりです コードをコピー

HTTP/1.x 304 は変更されていません
日付: 2009 年 3 月 3 日火曜日 05:03:56 GMT
コンテンツタイプ: 画像/jpeg
コンテンツの長さ: 83185
最終更新日: 2009 年 2 月 24 日火曜日 08:01:04 GMT
キャッシュ制御: max-age=2592000
有効期限: 2009 年 4 月 2 日(木) 05:14:08 GMT
Eタグ: 「5d8c72a5edda8d6a:3239」


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”

クライアントのクエリ更新形式は次のとおりです:

None 一致の場合 1 件: 「5d8c72a5edda8d6a:3239」

ETag が変更されていない場合は、ステータス 304 が返されます。
つまり、クライアントがリクエストを行った後、HTTP レスポンス ヘッダーには Etag: “5d8c72a5edda8d6a:3239”
が含まれます。 この識別子は、取得したリソースの ID が 5d8c72a5edda8d6a:3239 であることをクライアントに伝えるのと同じです。

次回同じ URI のリクエストを送信する必要がある場合、ブラウザは If-None-Match ヘッダー (Http Request Header) も送信します。このとき、ヘッダー内の情報には前回のアクセスで取得した Etag が含まれます。 : "5d8c72a5edda8d6a:3239"。

None 一致の場合 1 件: 「5d8c72a5edda8d6a:3239」

このようにして、クライアント側は 2 つのコピーをキャッシュし、サーバー側は 2 つの etag を比較します。 If-None-Match が False の場合、200 は返されませんが、304 (Not Modified) 応答が返されます。

3、有効期限があります

指定された日付/時刻を過ぎると、応答は古いとみなされます。有効期限など: 2009 年 4 月 2 日木 05:14:08 GMT
Last-Modified と組み合わせて使用​​する必要があります。リクエストされたファイルの有効期限を制御するために使用され、リクエストされたデータが有効期間内である場合、クライアントのブラウザは、キャッシュ内のデータが無効または期限切れの場合に、サーバーの代わりにキャッシュにデータをリクエストします。サーバーからのデータ。

4、最終更新日と期限切れ

Last-Modified フラグは帯域幅を少し節約できますが、HTTP リクエストの送信から逃れることはできないため、Expires と併用する必要があります。 Expires フラグを使用すると、たとえば、ユーザーが F5 キーを押すか [更新] ボタンをクリックした場合でも、Expires を持つ URI に対しても HTTP リクエストが送信されなくなります。したがって、Last-Modified が必要になります。を使用し、Expires と一緒に使用する必要があります。

5、Etag と有効期限

Etag と Expires の両方がサーバー側で設定されている場合、Etag の原理は同じです。つまり、Last-Modified/Etag に対応する Http リクエスト ヘッダー: If-Modified-Since および If-None-Match です。これら 2 つのヘッダーの値は、Web サーバーによって送信された Last-Modified 値と Etag 値とまったく同じであることがわかります。サーバーは、If-Modified-Since と If-None- が完全に一致した場合にのみ返されます。つまり、変更時刻と Etag を確認した後に一致します。

6、最終更新日と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 が含まれないように、セッションを閉じることに注意する必要があります。

3.1、期限切れ

例:expires.php

コードは次のとおりですコードをコピー 3.2.Eタグ
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’);



Http の戻りステータスに応じて処理されます。 304を返す場合はキャッシュから直接読み込みます

etag.phpなど


コードは次のとおりですコードをコピーキャッシュ() echo date(”Y-m-d H:i:s”); 関数キャッシュ() コードをコピー
{

$etag = “http://longrujun.name”; If (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
$_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
                                                                        header('Etag:'.$etag,true,304); 出る
}
else header('Etag:'.$etag); }




画像キャッシュの例


コードは次のとおりです

$eTag = $imagePath; $eTag .= ファイルMTime($imagePath); $eTag = md5($eTag); (ストリップスラッシュ($_SERVER['HTTP_IF_NONE_MATCH']) == $eTag)) { header("HTTP/1.1 304 未変更", TRUE, 304); 終了(); }http://www.bkjia.com/PHPjc/631550.html
$imagePath = "パス/画像へのパス"; if((isset($_SERVER['HTTP_IF_NONE_MATCH'])) &&
header("ETag: ".$eTag); header("Content-Type: image/png"); readFile($imagePath); exit();




上記の方法は非常に簡単です。以下の完全な例を参照してください

tru​​e
コードは次のとおりです コードをコピー

$fullpath = '/www/images/' .basename($_GET['img']); //ファイルはすべて /www/images/ の下にあると仮定します。 if (!is_file($fullpath)) {
header("HTTP/1.0 404 が見つかりません"); 終了(); }

$info = getImageSize($fullpath) //画像情報を取得します
if (!$info) { header("HTTP/1.0 404 が見つかりません"); 終了(); }

// 以下のヘッダー関数はすべてヘッダー情報を出力します。もっと。
header('Content-type: '. $info['mime']) //image/png と同様
header('Content-Length: '.filesize($fullpath)); //ファイルの長さ

header('Pragma: '); // 役に立たないが、サーバーがひどい単語を生成しないように設定する必要がある-キャッシュ

//有効期限を手動で設定します。単位は秒です
$validtime = 48* 60 * 60 // 48 時間
;
//キャッシュ相対リクエスト時間、
header('キャッシュ制御: ' . 'max-age='. $validtime);
// Expires ヘッダーも非常に重要で、その機能は max-age と似ています
//time()+$validtime: 期間を設定すると、有効期限が切れた後にリクエストがサーバーに送信されます
//gmdate、Sun, 01 Mar 2009 04:05:49 +0000 という文字列を生成します。これは GMT 標準タイムゾーンです
//preg_replace、Generate Sun、2009 年 3 月 1 日 04:05:49 GMT、注: これはサーバー設定に関連している可能性があります、
//ただし、デフォルト設定を使用します
header('Expires:'.preg_replace('/.{5}$/', 'GMT', gmdate('r', time()+ $validtime)));
//ファイルの最終変更時刻
$lasttime = filemtime($fullpath);
// 最終変更時刻が設定されているため、[更新] をクリックすると、ブラウザは画像を再度リクエストするときに 'IF_MODIFIED_SINCE' ヘッダーを送信します。 //PHP プログラムによって読み取られます
header('Last-Modified: ' .preg_replace('/.{5}$/', 'GMT', gmdate('r', $lasttime) ));
//重要、リクエスト内の時間とファイル生成のタイムスタンプが等しい場合、ファイルは変更されておらず、クライアントはそれをキャッシュできます
if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lasttime) {
header("HTTP/1.1 304 Not Modified"); // サーバーはファイルが変更されていないという命令を発行します
終了(); }

// ファイルが変更された場合は、データを再送信する必要があります
echo file_get_contents($fullpath);










http://www.bkjia.com/PHPjc/631550.html

www.bkjia.com
技術記事

php を使用してブラウザのキャッシュを開く場合でも、Apache または iis サーバー環境を使用して設定する場合でも、ブラウザの Cache-Control に基づいて動作します...

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。