首頁 後端開發 php教程 PHP设置图片浏览器缓存方法介绍_PHP教程

PHP设置图片浏览器缓存方法介绍_PHP教程

Jul 13, 2016 pm 04:57 PM
apache iis php 介紹 你是 使用 圖片 打開 方法 瀏覽器 快取 設定 還是

不管你是使用php打开浏览器缓存还是使用apache,iis服务器环境来配置我们都是会针对浏览器的Cache-Control来操作,下面我来给大家介绍PHP设置图片浏览器缓存

Cache-Control

Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令通常覆盖默认缓存算法。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。

cache-control 定义是:Cache-Control = “Cache-Control” “:” cache-directive。表 1 展示了适用的值。

表 1. 常用 cache-directive 值
Cache-directive 说明
public 所有内容都将被缓存
private 内容只缓存到私有缓存中
no-cache 所有内容都不会被缓存
no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中
must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证
max-age=xxx (xxx is numeric) 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高

在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Reponse Header),服务器端的返回状态会是200,格式类似如下:

 代码如下 复制代码

HTTP/1.1 200 OK
Date: Tue, 03 Mar 2009 04:58:40 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000
Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: “5d8c72a5edda8d6a:3239″


客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应并记录相关记录属性标记文件没有发生改动,服务器端返回304,直接从缓存中读取:

 代码如下 复制代码

HTTP/1.x 304 Not Modified
Date: Tue, 03 Mar 2009 05:03:56 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000
Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: “5d8c72a5edda8d6a:3239″


一、Last-Modified、Expires和Etag相关工作原理
1、Last-Modified
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记(Http Reponse Header)此文件在服务期端最后被修改的时间,格式类似这样:

1 Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头(Http Request Header),询问该时间之后文件是否有被修改过:

1 If-Modified-Since: Tue, 24 Feb 2009 08:01:04 GMT
如 果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而 保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

注:如果If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,会认为是个非法请求

2、Etag工作原理

HTTP 协议规格说明定义ETag为“被请求变量的实体标记” (参见14.19)。

简单点即服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,类似服务器端返回的格式:

1 Etag: “5d8c72a5edda8d6a:3239″
客户端的查询更新格式是这样的:

1 If-None-Match: “5d8c72a5edda8d6a:3239″
如果ETag没改变,则返回状态304。
即:在客户端发出请求后,Http Reponse Header中包含 Etag: “5d8c72a5edda8d6a:3239″
标识,等于告诉Client端,你拿到的这个的资源有表示ID:5d8c72a5edda8d6a:3239。

当下次需要发Request索要同一个URI的时候,浏览器同时发出一个If-None-Match报头( Http Request Header)此时包头中信息包含上次访问得到的Etag: “5d8c72a5edda8d6a:3239″标识。

1 If-None-Match: “5d8c72a5edda8d6a:3239″
这样,Client端等于Cache了两份,服务器端就会比对2者的etag。如果If-None-Match为False,不返回200,返回304 (Not Modified) Response。

3、Expires
给出的日期/时间后,被响应认为是过时。如Expires: Thu, 02 Apr 2009 05:14:08 GMT
需和Last-Modified结合使用。用于控制请求文件的有效时间,当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端. 当缓存中数据失效或过期,才决定从服务器更新数据。

4、Last-Modified和Expires
Last-Modified标识能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而且要和Expires一起用。而Expires标识却使得浏 览器干脆连HTTP请求都不用发,比如当用户F5或者点击Refresh按钮的时候就算对于有Expires的URI,一样也会发一个HTTP请求出去, 所以,Last-Modified还是要用的,而 且要和Expires一起用。

5、Etag和Expires
如果服务器端同时设置了Etag和Expires时,Etag原理同样,即与Last-Modified/Etag对应的Http Request Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和Web Server发出的Last-Modified,Etag值完全一样;在完全匹配If-Modified-Since和If-None-Match即检查 完修改时间和Etag之后,服务器才能返回304.

6、Last-Modified和Etag
Last-Modified 和ETags请求的http报头一起使用,服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改,来决定文件是否继续缓存

过程如下:
1. 客户端请求一个页面(A)。
2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

注:
1、Last-Modified和Etag头都是由Web Server发出的Http Reponse Header,Web Server应该同时支持这两种头。
2、Web Server发送完Last-Modified/Etag头给客户端后,客户端会缓存这些头;
3、客户端再次发起相同页面的请求时,将分别发送与Last-Modified/Etag对应的Http Request Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和Web Server发出的Last-Modified,Etag值完全一样;
4、通过上述值到服务器端检查,判断文件是否继续缓存;

二、对于非实时交互动态页面中Epires和Etag处理
对数据更新并不频繁、如tag分类归档等等,可以考虑对其cache。简单点就是在非实时交互的动态程序中输出expires和etag标识,让其缓存。 但需要注意关闭session,防止http response时http header包含session id标识;

3.1、Expires
如expires.php

 代码如下 复制代码

header(’Cache-Control: max-age=86400,must-revalidate’);
header(’Last-Modified: ‘ .gmdate(’D, d M Y H:i:s’) . ‘ GMT’ );
header(”Expires: ” .gmdate (’D, d M Y H:i:s’, time() + ‘86400′ ). ‘ GMT’);


3.2、Etag
根据Http返回状态来处理。当返回304直接从缓存中读取
如etag.php

 代码如下 复制代码

cache();
echo date(”Y-m-d H:i:s”);
function cache()
{
       $etag = “http://longrujun.name”;
       if (isset($_SERVER['HTTP_IF_NONE_MATCH'])  &&
$_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
       {
              header(’Etag:’.$etag,true,304);
              exit;
       }
       else header(’Etag:’.$etag);
}

图片缓存实例

 代码如下 复制代码


$imagePath = "path/to/some/image";
 
$eTag = $imagePath;
$eTag .= fileMTime($imagePath);
$eTag = md5($eTag);
 
if((isset($_SERVER['HTTP_IF_NONE_MATCH'])) &&
(stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == $eTag)) {
    header("HTTP/1.1 304 Not Modified", TRUE, 304);
    exit();
}
 
header("ETag: ".$eTag);
header("Content-Type: image/png");
readFile($imagePath);
exit();

上面的方法超级简单,下面看个完整实例

 代码如下 复制代码

$fullpath = '/www/images/' . basename($_GET['img']); //假定文件都在/www/images/下
if (!is_file($fullpath)) {
    header("HTTP/1.0 404 Not Found");
    exit();
}
 
$info = getImageSize($fullpath); //获取图片信息
if (!$info) {                    //如果不是图片
    header("HTTP/1.0 404 Not Found");
    exit();
}
 
// 以下凡是header函数都是在输出头部信息。较多。
header('Content-type: '. $info['mime']);          //类似于image/png
header('Content-Length: '. filesize($fullpath));  //文件长度
 
header('Pragma: ');             //没用,但要设置,防止服务器生成no-cache的可怕字眼
 
//手动设置过期时间,单位都是秒
$validtime = 48* 60 * 60;    // 48小时
 
//缓存相对请求的时间,
header('Cache-Control: ' . 'max-age='. $validtime);
 
//也很重要的Expires头,功能类似于max-age
//time()+$validtime: 设置期限,到期后才会向服务器提交请求
//gmdate,生成Sun, 01 Mar 2009 04:05:49 +0000  的字符串,而且是GMT标准时区
//preg_replace,  生成Sun, 01 Mar 2009 04:05:49 GMT, 注意:可能与服务器设置有关,
//但我都用默认设置
header('Expires:'. preg_replace('/.{5}$/', 'GMT', gmdate('r', time()+ $validtime)));
 
//文件最后修改时间
$lasttime = filemtime($fullpath);
 
//最后修改时间,设置了,点击刷新时,浏览器再次请求图片才会发出'IF_MODIFIED_SINCE'头,
//从而被php程序读取
header('Last-Modified: ' . preg_replace('/.{5}$/', 'GMT', gmdate('r', $lasttime) ));
 
//重要,如果请求中的时间和 文件生成时间戳相等,则文件未修改,客户端可用缓存
if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lasttime) {
    header("HTTP/1.1 304 Not Modified"); //服务器发出文件不曾修改的指令
    exit();
}
 
//如果文件被修改了,只好重新发出数据
echo file_get_contents($fullpath);

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/631550.htmlTechArticle不管你是使用php打开浏览器缓存还是使用apache,iis服务器环境来配置我们都是会针对浏览器的Cache-Control来操作,下面我来给大家介绍PHP设置图...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1252
24
session_start()函數的意義是什麼? session_start()函數的意義是什麼? May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

Laravel 實時聊天應用:WebSocket 與 Pusher 結合 Laravel 實時聊天應用:WebSocket 與 Pusher 結合 Apr 30, 2025 pm 02:33 PM

在Laravel中構建實時聊天應用需要使用WebSocket和Pusher。具體步驟包括:1)在.env文件中配置Pusher信息;2)設置broadcasting.php文件中的廣播驅動為Pusher;3)使用LaravelEcho訂閱Pusher頻道並監聽事件;4)通過PusherAPI發送消息;5)實現私有頻道和用戶認證;6)進行性能優化和調試。

在手機上使用原生select會遇到哪些問題? 在手機上使用原生select會遇到哪些問題? Apr 30, 2025 pm 03:06 PM

使用原生select在手機上的問題在移動設備上開發應用時,我們經常會遇到需要用戶進行選擇的場景。雖然原生sel...

作曲家:PHP開發人員的軟件包經理 作曲家:PHP開發人員的軟件包經理 May 02, 2025 am 12:23 AM

Composer是PHP的依賴管理工具,通過composer.json文件管理項目依賴。 1)解析composer.json獲取依賴信息;2)解析依賴關係形成依賴樹;3)從Packagist下載並安裝依賴到vendor目錄;4)生成composer.lock文件鎖定依賴版本,確保團隊一致性和項目可維護性。

IIS的目的:在Windows上提供Web內容 IIS的目的:在Windows上提供Web內容 Apr 30, 2025 am 12:06 AM

IIS是微軟為Windows操作系統提供的Web服務器軟件,選擇它的原因包括與Windows系統的無縫集成和豐富的功能。 1)IIS支持多種編程語言和框架,適合託管靜態和動態內容。 2)通過IIS管理器可以輕鬆創建和管理網站。 3)IIS提供URL重寫功能,提升SEO效果。 4)常見錯誤如404和500可以通過檢查配置和日誌解決。 5)性能優化包括啟用壓縮、配置緩存和負載均衡,提升網站速度和可靠性。

Apache在網絡開發中的作用:開拓技術 Apache在網絡開發中的作用:開拓技術 May 01, 2025 am 12:12 AM

Apache在Web開發中的作用包括靜態網站託管、動態內容服務、反向代理與負載均衡。 1.靜態網站託管:Apache配置簡單,適合託管靜態網站。 2.動態內容服務:通過與PHP等結合,提供動態內容。 3.反向代理與負載均衡:作為反向代理,分發請求到多個後端服務器,實現負載均衡。

作曲家的目的:管理PHP中的項目依賴性 作曲家的目的:管理PHP中的項目依賴性 Apr 30, 2025 am 12:01 AM

我們需要Composer因為它能有效管理PHP項目的依賴,避免版本衝突和手動管理庫的麻煩。 Composer通過composer.json聲明依賴,並使用composer.lock確保版本一致,簡化了依賴管理過程,提高了項目穩定性和開發效率。

怎樣設置 HTML 元素的旋轉效果 怎樣設置 HTML 元素的旋轉效果 Apr 30, 2025 pm 02:42 PM

如何在HTML中設置元素的旋轉效果?使用CSS和JavaScript可以實現。 1.CSS的transform屬性用於靜態旋轉,如rotate(45deg)。 2.JavaScript可動態控制旋轉,通過改變transform屬性實現。

See all articles