日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP客户端缓存控制

發布時間:2024/4/11 php 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP客户端缓存控制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

-by 落杉

?

客戶端緩存控制通常也會被叫做條件GET請求。

五種常用于控制客戶端緩存的頭標

  • Last-Modified (最后修改時間)
  • ETag (實體標簽)
  • Expires (有效指示)
  • Pragma (編譯指示)
  • Cache-Control (緩存控制)

1.Last-Modified

這個頭標是一個響應頭標,表示客戶端(通常指瀏覽器)所請求資源在服務器端的最后修改時間,通常情況下客戶端在接受這個頭標后,在以后對這個資源的 請求會附帶一個'If-Modified-Since'請求頭標,而這個頭標是想告訴服務器上次客戶端所請求資源的最后修改時間,對于一些圖 像,css,js等靜態文件資源,配置好了的apache服務器會理解這些If-Modified-Since請求頭標,將頭標里的時間和文件的最后修改 時間進行比較并作出響應,如果二者相等則發送一個304 Not Modfied來告訴客戶端所請求資源并未修改讓客戶端放心使用緩存中的資源,否則的話會重新發送一個新的資源和新的Last-Modified的頭標。 但是對于一個動態的PHP腳本,我們即使在腳本加入了header('Last Modified: '.$time)來發送一個Last Modified響應頭標,當客戶端附帶'If-Modified-Since'在次請求時apache服務器不會進行處理,這需要我們自己 用$_SERVER['HTTP_IF_MODIFIED_SINCE']來獲取'If-Modified-Since'的值自己來進行判斷處理。

2.ETag

ETag(Entity Tag)和Last-Modified類似,也是WEB服務器和客戶端用于確認緩存組件的有效性的一種機制,apache 1.3和2.0的ETag格式是inode-size-timestamp,因此當資源被修改,其ETag也發生改變,ETag相對Last- Modified更精確,Last-Modified只能精確的s級別,但是ETag在多服務器可能造成混亂,所以用還是不用還得看實際情況,其相對應的 后續請求頭標為If-None-Match。

3.Expires

Expires表明緩存何時因該過期(GMT時間),屬于HTTP 1.0 標準,通常是用來對Cache-Control的max-age的一個補充,來兼容HTTP 1.0,不贊成單獨使用Expires,因為客戶端時間容易發生偏差。

4.Pragma

HTTP 1.0 標準,通常是在不緩存時使用,Pragma: no-cache。

5.Cache-Control

Cache-Control常用指令(暫時我還沒找到完整版本的)

public 可以在任何地方緩存
private 只能被瀏覽器緩存
no-cache 不能在任何地方緩存
must-revalidate 緩存必須檢查跟新版本
proxy-revalidate 代理緩存必須檢查跟新版本
max-age 內容能夠被緩存的時間
s-maxage 覆蓋共享緩存的max-age設置

瀏覽器行為影響

在先前有效訪問后,在以后對同一URI資源的請求中,瀏覽器只進行兩種動作:(1)直接在緩存中去獲取內容。如果先前有效訪問的響應頭包含 Expires,max-age的話,'打開新窗口' '輸入URI回車' '前一頁' '后一頁'這些瀏覽器行為不會使瀏覽器在Expires,max-age設置的有效期時間內去訪問服務器,而是在緩存中去獲取內容,但是' 刷新' 或 '重載'例外。(2)訪問服務器,根據服務器響應來獲取內容。這種情況發生在設置no-cache等頭標要求不緩存,或者是設置了 Expires,max-age但瀏覽器行為是 ' 刷新' 或 '重載'時候。'Last-Modified' 'ETag' 'must-revalidate' 等有些特殊,不直接受瀏覽器行為影響,它們也是訪問服務器后,再由服務器判斷是發送新的資源,還是發送一個304 Not Modfied讓瀏覽器使用緩存中的資源。

PHP代碼
  • <?php??
  • function??http_cache_control(?$type?=?'nocache'?,?$interval?=0,?$mktime?=?''?,?$etag?=?''?){??
  • ????if?(?$type?==?'nocache'?){??
  • ????????header('Expires:?-1'?);??
  • ????????header('Pragma:?no-cache'?);??
  • ????????header('Cache-Control:?no-store,?no-cache,?must-revalidate,?post-check=0,?pre-check=0'?);??
  • ????}else?{??
  • ????????if?(isset(?$_SERVER?[?'HTTP_IF_NONE_MATCH'?])?&&??$etag??&&??$_SERVER?['HTTP_IF_NONE_MATCH'?]?==??$etag?){??
  • ????????????header('HTTP/1.1?304?Not?Modfied'?);??
  • ????????}elseif?(isset(?$_SERVER?[?'HTTP_IF_MODIFIED_SINCE'?])?&&??$mktime??&&??$_SERVER?['HTTP_IF_MODIFIED_SINCE'?]?==??gmdate?(?'r'?,?$mktime?).?'?GMT'?){??
  • ????????????header('HTTP/1.1?304?Not?Modfied'?);??
  • ????????}else?{??
  • ????????????if?(?$mktime?){??
  • ????????????????$gmtime??=??gmdate?(?'r'?,?$mktime?+?$interval?).?'?GMT'?;??
  • ????????????????header('Expires:?'?.?$gmtime?);??
  • ????????????}??
  • ????????????if?(?$type?==?'public'?){??
  • ????????????????header('Cache-Control:?public,max-age='?.?$interval?);??
  • ????????????}elseif?(?$type?==?'private'?){??
  • ????????????????header('Cache-Control:?private,max-age='?.?$interval?.?',s-maxage=0'?);??
  • ????????????}elseif?(?$type?==?'none'?){??
  • ????????????????header('must-revalidate,proxy-revalidate'?);??
  • ????????????}??
  • ????????}??
  • ????????$mktime?&& header(?'Last-Modified:?'?.?gmdate?(?'r'?,?$mktime?)?.?'?GMT'?);??
  • ????????$etag????&&??header(?'ETag:?'?.?$etag?);??
  • ????}??
  • }??
  • ?>??
  • 轉載于:https://my.oschina.net/bugyang/blog/121836

    總結

    以上是生活随笔為你收集整理的PHP客户端缓存控制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。