国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

php控制客戶端緩存

2020-03-22 20:09:41
字體:
來源:轉載
供稿:網友
  • 1.關于HTTP消息

    詳見: http://www.runoob.com/http/http-messages.html
    http消息中請求頭是瀏覽器要告訴服務器的信息,而響應頭是服務器要告訴客戶端的信息。這些頭的定義是HTTP協議定義好的,客戶端和服務器通過解析消息頭中信息來完成各自的工作。比如:請求頭中Accept-Language:zh-CN,zh;q=0.8 告訴服務器客戶端能接收的語言。

    2.響應頭Cache-Control控制緩存

    這里寫圖片描述
    Cache-Control 一個用于定義緩存指令的通用頭標。

    緩存策略:
    有用的 Cache-Control響應頭信息包括:

    max-age=[秒] — 執行緩存被認為是最新的最長時間。類似于過期時間,這個參數是基于請求時間的相對時間間隔,而不是絕對過期時間,[秒]是一個數字,單位是秒:從請求時間開始到過期時間之間的秒數。s-maxage=[秒] — 類似于max-age屬性,除了他應用于共享(如:代理服務器)緩存public — 標記認證內容也可以被緩存,一般來說: 經過HTTP認證才能訪問的內容,輸出是自動不可以緩存的;private在服務器設置了private比如:Cache-Control:private, max-age=60的情況下,表示只有用戶的瀏覽器可以緩存private響應,不允許任何中繼Web代理對其進行緩存 – 例如,用戶瀏覽器可以緩存包含用戶私人信息的HTML網頁,但是CDN不能緩存。no-cache — 強制每次請求直接發送給源服務器,而不經過本地緩存版本的校驗。這對于需要確認認證應用很有用(可以和public結合使用),或者嚴格要求使用最新數據的應用(不惜犧牲使用緩存的所有好處);no-store — 不做緩存must-revalidate — 告訴緩存必須遵循所有你給予副本的新鮮度。使用緩存的時候每次必須發送請求到服務器校驗,比如通過If-Modified-Since或If-None-Matchproxy-revalidate — 和 must-revalidate類似,除了他只對緩存代理服務器起作用,舉例:Cache-Control: max-age=3600, must-revalidate
    <?phpheader('Content-type:text/html;charset=utf-8');//用Cache-Control告訴瀏覽器有效期 5秒header('Cache-Control:max-age=5');//等同于Cache-Control:public, max-age=5$curr_time = date('Y-m-d H:i:s');echo '服務器時間:'.$curr_time;?><!DOCTYPE html><html><head><meta charset='utf-8'><title>Cache</title></head><body><br>    Time:<?php  echo $curr_time; ?><br>    <a href='cache_sample.php'>刷新時間</a></body></html>

    這里寫圖片描述

    3.響應頭Expires控制緩存
    <?phpheader('Content-type:text/html;charset=utf-8');//用Cache-Control告訴瀏覽器有效期 5秒// header('Cache-Control:max-age=5');//等同于Cache-Control:public, max-age=5//設置10秒的有效期,時間格式是GMT//時間是當前服務器時間 + 10秒$expires = gmdate('D, d M Y H:i:s', time() + 10) . ' GMT'; header('Expires:$expires');$curr_time = date('Y-m-d H:i:s');echo '服務器時間:'.$curr_time;?><!DOCTYPE html><html><head><meta charset='utf-8'><title>Cache</title></head><body><br>    Time:<?php  echo $curr_time; ?><br>    <a href='cache_sample.php'>刷新時間</a></body></html>

    這里寫圖片描述
    expires的弊端是有效期以服務器時間設置,如果客戶端的時間和服務端時間有一定的時間差,緩存的控制就有問題了,所以還是建議使用Cache-Control好!

    上面的代碼如果同時設置了

    header('Cache-Control:max-age=5');$expires = gmdate('D, d M Y H:i:s', time() + 10) . ' GMT'; //這個設置將無效header('Expires:$expires');

    Cache-Control(支持) 和 expires 同時設置有效期,以 Cache-Control設置的有效期為準

    4.通過HTTP 304: Not Modified 使用緩存

    (1)響應頭包含 Expires, max-age的話,“打開新窗口”、“地址欄輸入url回車”這些瀏覽器行為不會使瀏覽器在Expires, max-age設置的有效期時間內去訪問服務器,而是在緩存中去獲取內容,但是”刷新’”或”F5” 例外。
    (2)訪問服務器,根據服務器響應來獲取內容。這種情況發生在設置了Cache-Control:no-cache 是否使用緩存必須要通過服務器驗證,或者是設置了 Expires,max-age但瀏覽器行為是“刷新”或“F5”時候。’Last-Modified’、’ETag’、’must-revalidate’ 等有些特殊,不直接受瀏覽器行為影響,它們必須訪問服務器后,再由服務器判斷是直接發送新的資源,還是發送一個304 Not Modfied讓瀏覽器使用緩存中的資源。

    注意: CTRL+ F5是強制刷新。

    這里寫圖片描述
    ETag全稱Entity Tag,用來標識一個資源。在具體的實現中,ETag可以是資源的hash值,也可以是一個內部維護的版本號。但不管怎樣,ETag應該能反映出資源內容的變化,這是Http緩存可以正常工作的基礎。Last-Modified的原理其實和ETag差不多,Last-Modified通過時間來標識資源。通過這樣的方式可以不必每次都獲取全部的資源達到更新的目的,能極大的節省服務器的開銷,更有利于搜素引擎的抓取。

    <?phpheader('Content-type:text/html;charset=utf-8');header('Cache-Control:no-cache');//響應頭Last-Modified$lastmodified = filemtime('./cache.php');$lastmodifiedGMT = gmdate('D, d M Y H:i:s',$lastmodified). ' GMT';header('Last-Modified:$lastmodifiedGMT');//響應頭ETag$etag = md5_file('./cache.php');header('ETag:$etag');if (@$_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastmodifiedGMT ||    @trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {        header('HTTP/1.1 304 Not Modified');        exit;    }//返回304后,下面的內容不會向瀏覽器返回,而瀏覽器會使用之前的緩存   $curr_time = date('Y-m-d H:i:s');echo '服務器時間:'.$curr_time;?><!DOCTYPE html><html><head><meta charset='utf-8'><title>Cache</title></head><body><br>    Time:<?php  echo $curr_time; ?><br>    <a href='cache_sample.php'>刷新時間</a></body></html>

    這里寫圖片描述

    引用:
    [1]寫給后端程序員的HTTP緩存原理介紹
    [2]面向站長和網站管理員的Web緩存加速指南[翻譯]
    [3]緩存Cache詳解

    PHP編程

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

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 深圳市| 焉耆| 沙雅县| 宁夏| 桂东县| 确山县| 神农架林区| 金坛市| 修文县| 巴彦县| 贡山| 营口市| 南澳县| 兴文县| 井研县| 慈利县| 垦利县| 如皋市| 吴堡县| 秭归县| 瑞安市| 抚松县| 外汇| 河源市| 巴中市| 宕昌县| 武隆县| 霸州市| 弋阳县| 滨州市| 北流市| 合川市| 阿鲁科尔沁旗| 怀宁县| 同江市| 刚察县| 宿迁市| 揭东县| 萍乡市| 彰武县| 澎湖县|