云南北大青鸟设计培训告诉你PHP应用中常用的9大缓存技术?

云南北大青鸟设计培训告诉你PHP应用中常用的9大缓存技术?,第1张

一、全页面静态化缓存

也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系统中比较常见,比如dedecms;

一种比较常用的实现方式是用输出缓存:

Ob_start()******要运行的代码*******$content=Ob_get_contents()****将缓存内容写入html文件*****Ob_end_clean()

二、数据缓存

顾名思义,就是缓存数据的一种方式;比如,商城中的某个商品信息,当用商品id去请求时,就会得出包括店铺信息、商品信息等数据,此时就可以将这些数据缓存到一个php文件中,文件名包含商品id来建一个唯一标示;下一次有人想查看这个商品时,首先就直接调这个文件里面的信息,而不用再去数据库查询;其实缓存文件中缓存的就是一个php数组之类;

Ecmall商城系统里面就用了这种方式;

三、查询缓存

其实这跟数据缓存是一个思路,就是根据查询语句来缓存;将查询得到的数据缓存在一个文件中,下次遇到相同的查询时,就直接先从这个文件里面调数据,不会再去查数据库;但此处的缓存文件名可能就需要以查询语句为基点来建立唯一标示;

按时间变更进行缓存

就是对于缓存文件您需要设一个有效时间,在这个有效时间内,相同的访问才会先取缓存文件的内容,但是超过设定的缓存时间,就需要重新从数据库中获取数据,并生产最新的缓存文件;比如,我将我们商城的首页就是设置2个小时更新一次。

四、页面部分缓存

该种方式,是将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示;可以使用类似于ob_get_contents的方式实现,也可以利用类似ESI之类的页面片段缓存策略,使其用来做动态页面中相对静态的片段部分的缓存。

该种方式可以用于如商城中的商品页;

五、Opcode缓存

首先php代码被解析为Tokens,然后再编译为Opcode码,最后执行Opcode码,返回结果;所以,对于相同的php文件,第一次运行时可以缓存其Opcode码,下次再执行这个页面时,直接会去找到缓存下的opcode码,直接执行最后一步,而不再需要中间的步骤了。

比较知名的是XCache、TurckMMCache、PHPAccelerator等。

六、按内容变更进行缓存

这个也并非独立的缓存技术,需结合着用;就是当数据库内容被修改时,即刻更新缓存文件;

比如,一个人流量很大的商城,商品很多,商品表必然比较大,这表的压力也比较重;我们就可以对商品显示页进行页面缓存;

当商家在后台修改这个商品的信息时,点击保存,我们同时就更新缓存文件;那么,买家访问这个商品信息时,实际问的是一个静态页面,而不需要再去访问数据库;

试想,如果对商品页不缓存,那么每次访问一个商品就要去数据库查一次,如果有10万人在线浏览商品,那服务器压力就大了;

七、内存式缓存

提到这个,可能大家想到的首先就是Memcached;memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

它就是将需要缓存的信息,缓存到系统内存中,需要获取信息时,直接到内存中取;比较常用的方式就是key_>value方式;

connect($memcachehost,$memcacheport)ordie("Couldnotconnect")$memcache->set('key','缓存的内容')$get=$memcache->get($key)//获取信息?>

八、apache缓存模块

apache安装完以后,是不允许被cache的。大理IT培训http://www.kmbdqn.cn/认为如果外接了cache或squid服务器要求进行web加速的话,就需要在htttpd.conf里进行设置,当然前提是在安装apache的时候要激活mod_cache的模块。

现在简单的来分析一下,首先,大家可以想一下,浏览器的缓存存放在哪里,如何在浏览器中判断强制缓存是否生效?

先看一下这张图

会发现在浏览器开发者工具的Network的Size栏会出现的三种情况:

状态码及区别:

from memory cache(内存中的缓存): 不访问服务器,一般已经加载过该资源且缓存在了内存当中,直接从内存中读取缓存。浏览器关闭后,数据将不存在(资源被释放掉了),再次打开相同的页面时,不会出现from memory cache。

from disk cache(是硬盘中的缓存): 不访问服务器,已经在之前的某个时间加载过该资源,直接从硬盘中读取缓存,关闭浏览器后,数据依然存在,此资源不会随着该页面的关闭而释放掉下次打开仍然会是from disk cache。

304 Not Modified: 访问服务器,发现数据没有更新,服务器返回此状态码。然后从缓存中读取数据。

在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(from memory cache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)。

内存缓存(from memory cache)和硬盘缓存(from disk cache)特点

(1)内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性:

1、快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。

2、时效性:一旦该进程关闭,则该进程的内存则会清空。

(2)硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

缓存原理

1、先查找内存,如果内存中存在,从内存中加载;

2、如果内存中未查找到,选择硬盘获取,如果硬盘中有,从硬盘中加载;

3、如果硬盘中未查找到,那就进行网络请求;

4、加载到的资源缓存到硬盘和内存;

执行顺序

现加载一种资源(例如:图片):

访问->200 ->退出浏览器

重新进来->200(from disk cache) ->刷新 ->200(from memory cache)

附一张流程图梳理一下

浏览器缓存只是计算机缓存的一种

1.内存缓存

将数据存到内存

2.代理服务器缓存

就是个自己找的中介。你拿东西先找中介,中介找房东,房东给中介,中介又给你。比如你需要房子钥匙,房东把钥匙放在中介那,你直接从中介那里拿钥匙。

3.CDN缓存

将数据存到CDN服务器。CDN也是个中介,不过这个中介是根据中介的忙碌程度(CDN服务器忙碌程度)、跟你的距离(CDN服务器和你的距离)自动给你分配的。

4.浏览器缓存( 我是个前端,只关注浏览器缓存。 )

根据HTTP协议决定要不要缓存,以什么方式缓存,缓存到哪(内存还是硬盘等)。

浏览器缓存是将浏览器请求过的数据(资源文件)保存到电脑上。需要再次使用的时候,直接从电脑上获取保存的数据(资源文件),这就是浏览器缓存

1.减少网络请求,节省流量

2.减轻服务器压力

3.资源加载速度快了,前端性能就更好了

1.Server Worker

还没搞懂,搞懂了再来写。

2.Memory Cache

内存中的缓存,关闭页面进程就释放内存

3.Disk Memory

硬盘中的缓存,不主动清理就一直在

4、Push Cache

推送缓存,是HTTP/2的内容,并没有严格执行HTTP头部的缓存指令。在Server Worker、Memory Cache、Disk Cache都没有命中的时候,它会被使用。在Session中存在,Session结束就会被释放,缓存时间短暂。

1.先去内存查找,找到直接加载

2.内存找不到,硬盘中找,找到直接加载

3.硬盘找不到进行网络请求

4.把请求获取的资源再缓存到硬盘和内存

1.强缓存

控制强制缓存的字段分别是Expires和Cache-Control,Cache-Control优先级比Expires高

-Expires设置一个绝对时间的GMT格式的时间字符串,这个是资源失效时间( 客户端的时间小于Expires的值,缺陷就是客户端的时间被改变就有问题 ),在这个时间之前都直接读取缓存。

-Cache-Control替代Expires,它利用的是相对时间,利用header信息字段的max-age值判断。

2.协商缓存

-Last-Modified/If-Modified-Since

Last-Modified:浏览器向服务器发送资源最后的修改时间

If-Modified-Since:当资源过期时,发现响应头具有Last-Modified声明,则再次向服务器请求时带上头if-modified-since,表示请求时间。服务器收到请求后,发现有if-modified-since则与被请求资源的最后修改时间进行对比(Last-Modified),若最后修改时间较新,说明资源又被改过,则返回最新资源,返回200;若最后修改时间较小,说明资源无新修改,返回304 ,使用缓存文件。

缺点:单位是秒,一秒内多次改变会认为没过期

-ETag/If-None-Match

ETag:由服务器生成返回给前端,帮助服务器控制web端的缓存验证,服务器会生成并且返回当前资源文件的一个唯一标识

If-None-Match:当资源过期时,发现响应头具有Etag声明,则再次向服务器请求时带上头if-none-match(唯一标识Etag值)。服务器收到该请求后,发现有If-None-Match则根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200。

1.强缓存不发请求,协商缓存会发请求给服务器确认有没有过期

2.强缓存文件更新浏览器不知道,协商缓存更新浏览器能实时知道

1.点击浏览器的刷新按钮时,全部走缓存

2.F5或者鼠标右键刷新强制缓存失效,不影响协商缓存

3.CTRL+F5影响强制缓存和协商缓存都失效


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/208795.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存