一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

深入PHP與瀏覽器緩存的分析

我們往往在服務(wù)器上對緩存設(shè)置進行各種優(yōu)化方案,但是我們卻很少注意到客戶端緩存,準確的說是瀏覽器的緩存機制。
其實每種瀏覽器都有緩存策略,會暫時將每一個瀏覽過的文件緩存在一個特殊的文件夾里。我們就可以在用戶重復(fù)提交頁面請求的時候,告訴用戶這個頁 面沒有改變,可以調(diào)用緩存。 那我們怎么知道用戶有沒有這個頁面的緩存數(shù)據(jù)呢? 其實瀏覽器在發(fā)送請求的時候會先發(fā)送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
其中
Last-Modified: Wed, 19 Jul 2006 07:40:06 GMT
ETag: "8c55da8d6abc61:2327"
就是有關(guān)頁面的緩存信息的。然后如果服務(wù)器返回的響應(yīng)代碼不是HTTP 200 (OK),而是 304的話,瀏覽器就會從緩存中讀取數(shù)據(jù)。
//告訴客戶端瀏覽器不使用緩存,HTTP 1.1 協(xié)議 
header("Cache-Control: no-cache, must-revalidate"); 

//告訴客戶端瀏覽器不使用緩存,兼容HTTP 1.0 協(xié)議 
header("Pragma: no-cache"); 
根據(jù)這個原理,可以用在不經(jīng)常更新或者需要經(jīng)常刷新的頁面,可以大大減輕服務(wù)器的負擔(dān),因為它如果發(fā)現(xiàn)客戶端有緩存,就向客戶端發(fā)送一個304響應(yīng),然后停止程序的執(zhí)行。

瀏覽器發(fā)出的請求中包含If-Modified-Since和If-None-Match 兩個參數(shù),第一個表示詢問數(shù)據(jù)的最后修改時間是否是Thu,19 Jun 2008 16:24:01 GMT 然后服務(wù)器就會檢查數(shù)據(jù)的最后修改時間,如果是該時間則返回狀態(tài)碼304(表示沒有修改),此時當(dāng)瀏覽器收到狀態(tài)碼是304時就不會下載數(shù)據(jù)而是從本地緩 存中調(diào)用。然而只有本地緩存中存在著該請求資源的數(shù)據(jù)時瀏覽器才會發(fā)送If-Modified-Since參數(shù)并且其值為上一次服務(wù)器所返回的Last- Modified的值(并不是所有的服務(wù)器都支持If-Modified-Since和If-None-Match );If-None-Match的功能也類似,它是由服務(wù)器返回的Etag的值生成的,可以是任意值,因為其作用僅僅是使服務(wù)器檢查數(shù)據(jù)的修改時間然后返 回而已,只要不為none(默認值)或不為空其它的都可以。

所以我們可以在代碼的最前部分設(shè)置返回給瀏覽的Etag為某個值,然后在這個資源被第二次請求的時候就會附帶著一個If-None-Match 參 數(shù),通過核實其值確實為所發(fā)出的Etag值時就可以指定服務(wù)器返回為304然后強行退出程序就行了,If-Modified-Since也是一樣的做法這 里就只給出etag方法的php版(Last-Modified版的太常見了如設(shè)置緩存超時等等):
php 代碼復(fù)制到剪貼板
復(fù)制代碼 代碼如下:
    if ($_SERVER["HTTP_IF_NONE_MATCH"] == "claymorephp.com")
    {
        header('Etag:'.'zhaiyun.com',true,304);
        exit();
    }
    else {
        header('Etag:'."claymorephp.com");
    }
    你還可以稍微改一下:
    $expires=date("Ymd"); //一天后緩存過期
    if ($_SERVER["HTTP_IF_NONE_MATCH"] == $expires)
    {
        header('Etag:'.$expires,true,304);
        exit();
    }
    else {
        header('Etag:'.$expires);
    }
if ($_SERVER["HTTP_IF_NONE_MATCH"] == "claymorephp.com") { header('Etag:'.'zhaiyun.com',true,304); exit(); } else { header('Etag:'."claymorephp.com"); } 你還可以稍微改一下: $expires=date("Ymd"); //一天后緩存過期 if ($_SERVER["HTTP_IF_NONE_MATCH"] == $expires) { header('Etag:'.$expires,true,304); exit(); } else { header('Etag:'.$expires); }

另外,當(dāng)GZIP和ETAG同時使用時有時會出問題,就是ETAG沒有值,這個問題是普遍存在的,我暫時沒有找到相關(guān)的原因,網(wǎng)上搜了一會,普遍的人稱之為BUG。
基于以上原因,關(guān)于phpBLOG的客戶端緩存是以下來處理的(同時對HTTP_IF_NONE_MATCH和HTTP_IF_MODIFIED_SINCE進行判斷):
php 代碼復(fù)制到剪貼板
復(fù)制代碼 代碼如下:
      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'])//eg:Sun, 02 Nov 2008 07:08:25 GMT; length=35849
        {
            $array=explode(' ',$_SERVER['HTTP_IF_MODIFIED_SINCE']);
            $gmday=$array[1];
            $month_array=array(
            "Jan"=>"01",
            "Feb"=>"02",
            "Mar"=>"03",
            "Apr"=>"04",
            "May"=>"05",
            "Jun"=>"06",
            "Jul"=>"07",
            "Aug"=>"08",
            "Sep"=>"09",
            "Oct"=>"10",
            "Nov"=>"11",
            "Dec"=>"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);
                exit();
            }
        }
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'])//eg:Sun, 02 Nov 2008 07:08:25 GMT; length=35849 { $array=explode(' ',$_SERVER['HTTP_IF_MODIFIED_SINCE']); $gmday=$array[1]; $month_array=array( "Jan"=>"01", "Feb"=>"02", "Mar"=>"03", "Apr"=>"04", "May"=>"05", "Jun"=>"06", "Jul"=>"07", "Aug"=>"08", "Sep"=>"09", "Oct"=>"10", "Nov"=>"11", "Dec"=>"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); exit(); } }

緩存的HEADER是這樣來發(fā)送的:
php 代碼復(fù)制到剪貼板
復(fù)制代碼 代碼如下:
     $client_cache_time=$config_client_cache_time*60*60;//單位 - 秒
            header('Cache-Control: public, max-age='.$client_cache_time);
            header('Expires: '.gmdate('D, d M Y H:i:s',time()+$client_cache_time).' GMT');//設(shè)置頁面緩存時間
            header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT');//返回最后修改時間
            header('Pragma: public');
            header('Etag:phpblog');//返回標(biāo)識,用于標(biāo)識上次的確訪問過(瀏覽器中存在緩存)
$client_cache_time=$config_client_cache_time*60*60;//單位 - 秒 header('Cache-Control: public, max-age='.$client_cache_time); header('Expires: '.gmdate('D, d M Y H:i:s',time()+$client_cache_time).' GMT');//設(shè)置頁面緩存時間 header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT');//返回最后修改時間 header('Pragma: public'); header('Etag:phpblog');//返回標(biāo)識,用于標(biāo)識上次的確訪問過(瀏覽器中存在緩存)

php技術(shù)深入PHP與瀏覽器緩存的分析,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国内久久久| 亚洲首页国产精品丝袜 | 免费激情视频网站 | 亚洲香蕉网久久综合影院3p | 亚洲a人| 亚洲精品国产精品国自产 | 国产精品一区二区久久不卡 | 国产在线一区二区三区欧美 | 伊人精品在线观看 | 国产自精品在线 | 看一级毛片国产一级毛片 | 色综合五月激情综合色一区 | 青草五月天 | 色黄网址 | 一区二区三区在线视频观看 | 亚洲欧美一区二区三区四区 | 日本韩国一级 | 91国内在线 | 男人操女人免费视频 | 国内第一永久免费福利视频 | 四虎永久免费在线 | 欧美成人免费午夜影视 | 美国三级日本三级久久99 | 一区视频 | 国产高清精品久久久久久久 | 国产福利免费看 | www婷婷| 亚洲精品在线网站 | 一区二区三区免费 | 久久久久久国产精品mv | 天天色天 | 久久综合爱| 国产成人咱精品视频免费网站 | 一区二区三区高清在线观看 | 亚洲国产天堂久久九九九 | 亚洲综合一区二区不卡 | 日韩精品一区二区三区中文字幕 | 国产成人短视频 | 精品一精品国产一级毛片 | 亚洲黄色激情网 | 久久久久国产一级毛片高清片 |