大话PHP缓存头

简介:

304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了。

我们自己在nginx上放一个文件,test.png。可以使用下面的地址进行访问:

http://test.yejianfeng.com/test.png

 

nginx配置文件如下:

Image

这个的etag关闭是由于nginx默认是开启etag的,说明见ngx_http_core_module(http://nginx.org/en/docs/http/ngx_http_core_module.html)。

现在我把etag关闭了,这个test.png的HTTP请求如下:

Image(1)

可以看到这里的Response Header 中Last-Modified并没有设置过期,所以Last-Modified是不生效的。加上没有其他的相关缓存头,这个时候,浏览器就没有缓存这个页面了。所以呢,不管你黏贴URL,F5 还是Ctrl F5,页面进行的请求Cache-Control都是设置no-cache,所以服务端响应都是200。

下面,修改nginx配置,增加一个expires 1d:

Image(2)

重启nginx,HTTP请求如下:

Image(3)

可以看出这里的Expires比Date多一天,所以就是服务端告诉客户端,你给我在本地缓存一天吧。

那么这个时候使用F5:

Image(4)

返回的就是304了,这个时候,就是本地浏览器缓存了这个页面,发送条件请求给服务端,条件请求里面带一个If-Modified-Since,客户端询问服务端,这个文件浏览器这边有缓存,如果你服务端的文件在这个时间点有更改,就发送一个更改后的文件给我,没有的话就发送一个304就好。

这里还有个问题,这个Last-Modified是怎么定的呢?它就是这个文件在服务器上的最后修改时间。

Image(5)

图中的15:31和last-Modified的07:31中间的8个小时是时区导致的。

我们touch来修改这个文件的最后修改时间:

Image(6)

然后再F5下这个URL:

Image(7)

服务端返回200了,而且Last-Modified也修改了。这个就很好理解了。

 

如果我不是使用F5,而是将url直接贴到浏览器呢?这个时候,浏览器的行为就是如果本地有缓存,就使用本地的缓存,如果本地没有缓存,就请求服务端。

我们可以做的实验是这样:

1 开启fiddler

2 ctrl + F5,这个时候fiddler中多了一个200响应

3 F5,这个时候fiddler中多了一个304响应

4 打开一个新标签,在地址栏输入url:http://test.yejianfeng.com/test.png  这个时候会发现fiddler并没有任何请求

5 ctrl + F5,这个时候fiddler多一个200响应

Image(8)

所以这里可以验证之前的文章:HTTP缓存相关头(http://www.cnblogs.com/yjf512/p/3244882.html)里面说的三种刷新的行为。

 

回到缓存头,清空浏览器的缓存,把expire的设置去掉,把etag打开

Image(9)

第一次访问:

Image(10)

看到这里使用ETag了,ETag就相当于一个版本号,HTTP协议中并没有规定etag的算法,它的具体计算就依靠web服务器自身了。ETag还有普通和弱ETag的区分(http://en.wikipedia.org/wiki/HTTP_ETag)。

第二次访问的时候:

Image(11)

客户端发送请求中有个If-None-Match,表示客户端询问服务端,如果你这边的这个文件的tag还是XXXXX,就返回304吧,不是的话就返回200。

所以If-None-Match + ETag是可以控制文件在浏览器中的缓存的。

 

关于缓存的头,有些是客户端的:

Cache-Control

If-Modified-Since

If-None-Match

有些是服务端的:

Expire

Last-Modified

ETag

 

相关这些头的说明可以看这篇:HTTP缓存相关头(http://www.cnblogs.com/yjf512/p/3244882.html)

 

好了,下面说一种情景:

我们再nginx中做了一个rewrite,所有的js都重写到myjs.php这个脚本,那么问个问题,js在F5的时候会发送条件请求,这个条件请求是不是会触发php呢?

 

答案是会的。条件请求也是一个普通的php请求,它会在触发php的。这个时候如果你需要返回304的话,就需要你在php程序中对If-modified或者If-None-Match进行判断了。

目录
相关文章
|
5月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
11天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
65 25
|
3月前
|
前端开发 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
【10月更文挑战第21天】 本文将深入浅出地探讨如何使用PHP与MySQL构建一个动态网站,从环境搭建到项目部署,全程实战演示。无论你是编程新手还是希望巩固Web开发技能的老手,都能在这篇文章中找到实用的技巧和启发。我们将一起探索如何通过PHP处理用户请求,利用MySQL存储数据,并最终呈现动态内容给用户,打造属于自己的在线平台。 ####
129 0
|
5月前
|
NoSQL 关系型数据库 MySQL
不是 PHP 不行了,而是 MySQL 数据库扛不住啊
【9月更文挑战第8天】这段内容讨论了MySQL在某些场景下面临的挑战及其原因,并指出这些问题不能完全归咎于MySQL本身。高并发读写压力、数据量增长以及复杂查询和事务处理都可能导致性能瓶颈。然而,应用程序设计不合理、系统架构不佳以及其他数据库选择和优化策略不足也是重要因素。综合考虑这些方面才能有效解决性能问题,而MySQL通过不断改进和优化,仍然是许多应用场景中的可靠选择。
191 9
|
2月前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发:从基础到实践####
本文将深入探讨PHP与MySQL的结合使用,展示如何构建一个动态网站。通过一系列实例和代码片段,我们将逐步了解数据库连接、数据操作、用户输入处理及安全防护等关键技术点。无论您是初学者还是有经验的开发者,都能从中获益匪浅。 ####
|
3月前
|
安全 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
——深入探索LAMP栈下的高效数据交互与处理技巧 ####
|
3月前
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
深入探索PHP与MySQL的协同工作机制,本文旨在通过一系列实战案例,揭示构建高效、稳定且用户友好的动态网站的秘诀。从环境搭建到数据交互,再到最佳实践分享,本文为开发者提供了一条清晰的学习路径,助力其在LAMP(Linux, Apache, MySQL, PHP/Perl/Python)栈上实现技术飞跃。 ####
|
2月前
|
关系型数据库 MySQL PHP
php实现一个简单的MySQL分页
通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。
78 4
|
3月前
|
关系型数据库 MySQL PHP
PHP与MySQL的无缝集成:构建动态网站的艺术####
本文将深入探讨PHP与MySQL如何携手合作,为开发者提供一套强大的工具集,以构建高效、动态且用户友好的网站。不同于传统的摘要概述,本文将以一个生动的案例引入,逐步揭示两者结合的魅力所在,最终展示如何通过简单几步实现数据驱动的Web应用开发。 ####
|
3月前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效协同开发策略####
本文深入探讨了PHP与MySQL在Web开发中的协同工作机制,通过优化配置、最佳实践和高级技巧,展示了如何提升数据库交互性能,确保数据安全,并促进代码可维护性。我们将从环境搭建讲起,逐步深入到查询优化、事务管理、安全防护及性能调优等核心环节,为开发者提供一套实战驱动的解决方案框架。 ####

热门文章

最新文章