ホームページ >バックエンド開発 >PHPチュートリアル >PHP とブラウザ キャッシュの詳細な分析_PHP チュートリアル

PHP とブラウザ キャッシュの詳細な分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:09:021054ブラウズ

私たちはサーバー上のキャッシュ設定に対してさまざまな最適化ソリューションを実行することがよくありますが、クライアント キャッシュ、正確に言うとブラウザのキャッシュ メカニズムに注目することはほとんどありません。
実際、すべてのブラウザには、閲覧した各ファイルを特別なフォルダーに一時的にキャッシュするキャッシュ ポリシーがあります。ユーザーがページリクエストを繰り返し送信すると、ページが変更されていないことをユーザーに伝えることができ、キャッシュを呼び出すことができます。 では、ユーザーがこのページのデータをキャッシュしたかどうかはどうすればわかるのでしょうか? 実際、ブラウザはリクエストを送信するときに、通常は次のように最初に http ヘッダーを送信します。
Date: Sun, 30 Jul 2006 09:18:11 GMT
Content-Type: image/gif
Last-Modified: Wed, 19 Jul 2006 07:40:06 GMT
ETag: "8c55da8d6abc61:2327"
Content-Length: 14757
where
Last-Modified: Wed, 19 Jul 2006 07:40:06 GMT
ETag: "8c55da8d6ab c61:2327"
ページのキャッシュ情報についてです。次に、サーバーから返された応答コードが HTTP 200 (OK) ではなく 304 の場合、ブラウザはキャッシュからデータを読み取ります。
//クライアント ブラウザにキャッシュを使用しないように指示します。HTTP 1.1 プロトコル
header("Cache-Control: no-cache, must-revalidate");

//クライアント ブラウザにキャッシュを使用しないように指示します。HTTP 1.0 プロトコルと互換性があります。
header("Pragma: no-cache");
この原則に従って、頻繁に更新されないページや頻繁に更新する必要があるページで使用できるため、サーバーの負担を大幅に軽減できます。クライアントにキャッシュがある場合は、それをクライアントに送信し、プログラムの実行を停止します。

ブラウザによって送信されるリクエストには、If-Modified-Since と If-None-Match という 2 つのパラメータが含まれています。最初のパラメータは、データの最終変更時刻が 2008 年 6 月 19 日木曜日 16:24:01 GMT であるかどうかを示します。次に、サーバーはデータの最終変更時刻を確認し、その時刻である場合はステータス コード 304 (変更がないことを示します) を返します。この時点で、ブラウザはステータス コード 304 を受信すると、ファイルをダウンロードしません。データですが、ローカル キャッシュから呼び出します。ただし、ブラウザーは、要求されたリソースのデータがローカル キャッシュに存在し、その値が最後のサーバーから返された Last-Modified 値である場合にのみ、If-Modified-Since パラメーターを送信します (すべてのサーバーが If-Modified -Since をサポートしているわけではありません) If-None-Match); If-None-Match には同様の機能があり、サーバーによって返される Etag の値によって生成され、その機能はサーバーに変更時刻をチェックさせることだけであるため、任意の値を指定できます。データを取得してから返すだけです。none (デフォルト値) または空でない限り、他は何でも問題ありません。

そのため、コードの最初の部分で、ブラウザーに返される Etag を特定の値に設定することができます。その後、このリソースが 2 回目にリクエストされるときに、検証するための If-None-Match パラメーターが伴います。 Etag 値が送信されると、サーバーが 304 を返し、プログラムを強制的に終了するように指定できます。ここでは、etag メソッドの php バージョンのみが指定されています。 Last-Modified バージョンは一般的すぎます (キャッシュ タイムアウトの設定など):
PHP コードをクリップボードにコピーします

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

if ($_SERVER[ "HTTP_IF_NONE_MATCH"] == "claymorephp.com")
{
header(' Etag:'.'zhaiyun.com',true,304);
exit();
}
else {
header('Etag:' ."claymorephp.com");
}
これを少し変更することもできます:
$expires=date("Ymd") //キャッシュは 1 日後に期限切れになります
if ($_SERVER["HTTP_IF_NONE_MATCH"] == $期限切れ)
{
header('Etag:'.$expires,true,304);
exit();
}
else {
header('Etag:'.$expires);
}
if ($_SERVER[ "HTTP_IF_NONE_MATCH"] == "claymorephp.com") { header('Etag:'. 'zhaiyun.com',true,304); } else { header('Etag:'."claymorephp.com") $expires=date("Ymd"); //キャッシュは 1 日後に期限切れになります if ($_SERVER["HTTP_IF_NONE_MATCH"] == $expires) { header('Etag:'. $expires,true,304); exit(); } else { header('Etag:'. $expires) }

また、GZIP と ETAG を同時に使用すると、問題が発生することがあります。つまり、この問題は一般的です。しばらくネットで調べても、それはよくあることです。
上記の理由を踏まえ、PHPBLOGのクライアントキャッシュは以下のように処理されます(同時にHTTP_IF_NONE_MATCH、HTTP_IF_MODIFIED_SINCEも判定されます):
PHPコードをクリップボードにコピー
コードをコピー コードは以下の通り以下に続きます:

if($_SERVER['HTTP_IF_NONE_MATCH'])
{
if($_SERVER['HTTP_IF_NONE_MATCH'] == 'phpblog')
{
header('Etag:phpblog',true,304);//制御浏览器缓存
$_SESSION['time_end']=microtime(true);
exit();
}
}
else if($_SERVER['HTTP_IF_ MODIFIED_SINCE'])//例:2008 年 11 月 2 日日曜日 07:08:グリニッジ標準時25時; length=35849
{
$array=explode(' ',$_SERVER['HTTP_IF_MODIFIED_SINCE']);
$gmday=$array[1];
$month_array=array(
「1月」=>「01」、
「2月」=>「02」、
「3月」=>「03」、
「4月」=>「04」、
「5月」=>「05」、
"ジュン"=> ;"06",
"7月"=>"07",
"8月"=>"08",
"9月"=>"09",
"10月"=>
"nov" => "11"、
"dec" => "12"); explode(':',$array[4]);
$gmtimestamp=gmmktime($array[0],$array[1],$array[2],$gmmonth,$gmday,$gmyear);
if( gmmktime()-$gmtimestamp<$config_client_cache_time*60*60)
{
header('Etag:phpblog',true,304);//制御浏览器缓存
$_SE SSION['time_end']=microtime(true);
exit();
}
}
if($_SERVER['HTTP_IF_NONE_MATCH']) { if($_SERVER['HTTP_IF_NONE_MATCH'] == 'phpblog') { header('Etag:phpblog',true,3) 04); //制御浏览器缓存 $_SESSION['time_end']=microtime(true);出口(); } } else if($_SERVER['HTTP_IF_MODIFIED_SINCE'])//例:Sun, 02 Nov 2008 07:08:25 GMT; length=35849 { $array=explode(' ',$_SERVER['HTTP_IF_MODIFIED_SINCE']); $gmday=$array[1]; $month_array=array( "1月"=>"01", "2月"=>"02", "3月"=>"03", "4月"=>"04", "5月"=> ;"05"、"6 月"=>"06"、"7 月"=>"07"、"8 月"=>"08"、"9 月"=>"09"、"10 月"=> ;"10"、"11 月"=>"11"、"12 月"=>"12"); $gmmonth=$month_array[$array[2]]; $gmyear=$array[3]; $array=explode(':',$array[4]); $gmtimestamp=gmmktime($array[0],$array[1],$array[2],$gmmonth,$gmday,$gmyear); if(gmmktime()-$gmtimestamp<$config_client_cache_time*60*60) { header('Etag:phpblog',true,304);//制御浏览器缓存 $_SESSION['time_end']=microtime(true);出口();


存存するHEADERは次のように送信されます:
PHP代码复制to剪贴板



复制代
代码如下:T $ Client_cache_time = $ config_client_cache_time*60*60; // 単位秒
Header ('Cache-CONTROL: PUBLIC, MAX-AGE ='. $ Client_time) ; M Y H:i:s',time()+$client_cache_time).' GMT');//ページのキャッシュ時間を設定します
header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');//最終変更時刻を返します
header('Pragma: public');// 最後の訪問を識別するために使用される識別子を返します (ブラウザにキャッシュがあります)
$client_cache_time=$config_client_cache_time*60*60;//単位秒ヘッダー('Cache-Control: public, max-age='.$client_cache_time header('Expires: '. gmdate( 'D, d M Y H:i:s',time()+$client_cache_time).' GMT');//ページ キャッシュ時間ヘッダーを設定します('Last-Modified: '.gmdate('D, d M Y H: i:s ',time()).' GMT');//最終変更時刻を返します header('Pragma: public');//最後の訪問を識別するための識別子を返します(ブラウザにキャッシュがあります)





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

www.bkjia.com

http://www.bkjia.com/PHPjc/327397.html技術記事私たちはサーバー上のキャッシュ設定に対してさまざまな最適化ソリューションを実行することがよくありますが、クライアント キャッシュ、正確に言えばブラウザーのキャッシュ メカニズムに注意を払うことはほとんどありません。 実際、すべてのブラウザ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。