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

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

Jul 13, 2016 pm 04:57 PM
apache iis php 導入 あなたは誰ですか 使用 写真 開ける 方法 ブラウザ キャッシュ 設定 まだ

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 Apr 06, 2025 am 12:03 AM

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

PHP関数引数と配列の開梱で...(SPLAT)演算子の目的と使用について説明してください。 PHP関数引数と配列の開梱で...(SPLAT)演算子の目的と使用について説明してください。 Apr 06, 2025 am 12:07 AM

PHPの...(SPLAT)演算子は、機能パラメーターと配列を開梱するために使用され、コードのシンプルさと効率を向上させます。 1)関数パラメーター解放:アレイ要素をパラメーターとして関数に渡します。 2)配列の開梱:アレイを別の配列または関数パラメーターに解除します。

Webページにローカルにインストールされている「Jingnan Mai Round Body」を正しく表示するにはどうすればよいですか? Webページにローカルにインストールされている「Jingnan Mai Round Body」を正しく表示するにはどうすればよいですか? Apr 05, 2025 pm 10:33 PM

最近、Webページにローカルにインストールされたフォントファイルを使用して、インターネットから無料のフォントをダウンロードし、システムに正常にインストールしました。今...

ネガティブマージンが場合によっては効果がないのはなぜですか?この問題を解決する方法は? ネガティブマージンが場合によっては効果がないのはなぜですか?この問題を解決する方法は? Apr 05, 2025 pm 10:18 PM

なぜマイナスマージンが場合によっては有効にならないのですか?プログラミング中、CSSの負のマージン(負...

H5プロジェクトの実行方法 H5プロジェクトの実行方法 Apr 06, 2025 pm 12:21 PM

H5プロジェクトを実行するには、次の手順が必要です。Webサーバー、node.js、開発ツールなどの必要なツールのインストール。開発環境の構築、プロジェクトフォルダーの作成、プロジェクトの初期化、コードの書き込み。開発サーバーを起動し、コマンドラインを使用してコマンドを実行します。ブラウザでプロジェクトをプレビューし、開発サーバーURLを入力します。プロジェクトの公開、コードの最適化、プロジェクトの展開、Webサーバーの構成のセットアップ。

CSSを介してサイズ変更シンボルをカスタマイズし、背景色で均一にする方法は? CSSを介してサイズ変更シンボルをカスタマイズし、背景色で均一にする方法は? Apr 05, 2025 pm 02:30 PM

CSSでサイズ変更シンボルをカスタマイズする方法は、背景色で統一されています。毎日の開発では、調整など、ユーザーインターフェイスの詳細をカスタマイズする必要がある状況に遭遇することがよくあります...

CSSとFlexBoxを使用して、さまざまな画面サイズで画像とテキストのレスポンシブレイアウトを実装する方法は? CSSとFlexBoxを使用して、さまざまな画面サイズで画像とテキストのレスポンシブレイアウトを実装する方法は? Apr 05, 2025 pm 06:06 PM

CSSを使用してレスポンシブレイアウトを実装して、Webデザインのさまざまな画面サイズの下でレイアウトの変更を実装する場合、CSS ...

クロスサイトリクエストフォーファリー(CSRF)とは何ですか?また、PHPにCSRF保護をどのように実装しますか? クロスサイトリクエストフォーファリー(CSRF)とは何ですか?また、PHPにCSRF保護をどのように実装しますか? Apr 07, 2025 am 12:02 AM

PHPでは、予測不可能なトークンを使用して、CSRF攻撃を効果的に防ぐことができます。特定の方法には次のものが含まれます。1。フォームのCSRFトークンを生成および埋め込みます。 2.リクエストを処理するときにトークンの有効性を確認します。

See all articles