PHP缓存控制的概念

PHP缓存控制的概念,php,caching,Php,Caching,我读过关于PHP缓存控制的文章 他们讲述了概念和编码,但我仍然无法理解: 这些代码放在哪里?把它放在所有页面上?在我的php文件的最开始? 我想知道浏览器会缓存整个HTML代码吗 我看到了很多关于缓存在图像文件、css文件上使用的例子。但是,如果我想在图像文件上添加标题,这是否意味着我需要先进行url重写,以将图像文件请求引导到php文件中?我假设您指的是关于浏览器缓存的缓存。如果是这样的话,您需要知道的是浏览器会跟踪您下载的每个文件。第二次访问某个页面后,浏览器首先检查您试图下载的文件(即图像

我读过关于PHP缓存控制的文章

他们讲述了概念和编码,但我仍然无法理解:

这些代码放在哪里?把它放在所有页面上?在我的php文件的最开始? 我想知道浏览器会缓存整个HTML代码吗


我看到了很多关于缓存在图像文件、css文件上使用的例子。但是,如果我想在图像文件上添加标题,这是否意味着我需要先进行url重写,以将图像文件请求引导到php文件中?

我假设您指的是关于浏览器缓存的缓存。如果是这样的话,您需要知道的是浏览器会跟踪您下载的每个文件。第二次访问某个页面后,浏览器首先检查您试图下载的文件(即图像或CSS文件)是否已在您的计算机上,并且在第一次和第二次访问之间未在网站上编辑

如果要实现浏览器缓存,可以使用一些HTTP头来控制用户的浏览器如何执行给定文件的验证和缓存。您可以使用以下内容:

header("Expires: Mon, 1 Jan 2000 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache"); 
这将强制浏览器不缓存文件。我展示的是一个相反的版本,您可以理解浏览器在给定具有特定标题的文件时的行为。第一行将告诉浏览器,您当前访问的文件已过期,请输入较旧的日期。如果将来将日期更改为1,则会得到相反的功能

接下来,第二行允许脚本告诉浏览器用户试图访问的文件最后一次被编辑的时间。如果您在web上的文件的上次修改日期早于您计算机上的日期(从您第一次访问时下载的文件),则您的浏览器将再次下载该文件,前提是自您上次访问后该文件已更改

第三行帮助解释一些浏览器(以及一些代理)在下载文件时的行为。这里有不同的选项,你可以看到所有的选项

最后一个类似于前一个,但适用于较旧的系统

否则,还有另一个选项,但与PHP无关:您可以配置服务器应用程序来为您处理缓存控制头(如果您使用的是PHP,我假设是Apache或Nginx),这样您就不需要重写所有内容或将其传递给PHP文件

如果您使用的是Apache,则可以在.htaccess文件中使用如下内容:

# 480 weeks 
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> 
Header set Cache-Control "max-age=290304000, public" 
</FilesMatch>   

谢谢你的回答,你刚才说其他的文章都告诉我我已经读过了。但我感到困惑的是我的问题。为了向这些文件添加标题,您需要首先使用服务器端语言(如PHP)进行处理,因此是的,您最终将重写URL。还有另一个选项:您还可以使用服务器软件控制缓存控制标题(如果您使用PHP,可能是Apache或Nginx)。如果这样做,就不需要修改文件,甚至不需要将它们传递给PHP来处理。如果您使用的是Nginx,则只需修改.htaccess(如果您使用的是Apache)或站点内部的站点配置即可。在那里,您可以使用与url重写类似的规则设置规则,但这意味着要配置头。所以,你最终会告诉我们,所有以CSS结尾的URL都会有以下标题。哦,谢谢。如果你不回答,我永远也不会知道,因为所有这些文章都没有告诉我代码应该放在哪里。@user3662467我在响应中添加了服务器配置。我之前没有回答这些问题,因为您要求使用PHP提供解决方案。我可能错了,但这个问题可能会转移到另一个堆栈交换站点,如serverfault。
location ~* \.(css|js|gif|jpe?g|png)$ { 
expires 168h; 
add_header Pragma public; 
add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
}