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代碼轉載于:https://my.oschina.net/bugyang/blog/121836
總結
以上是生活随笔為你收集整理的PHP客户端缓存控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WCF中的ServiceHost初始化两
- 下一篇: onMeasure onLayout用