PHP中如何实现高效缓存技术以优化性能?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1764个文字,预计阅读时间需要8分钟。
缓存已经成为项目中不可或缺的一部分,它是提升性能的绝佳方式。以下章节将详细解析PHP中的缓存技术。
缓存是提升性能的最佳方式,例如减少网络I/O、减少磁盘I/O。
缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式。下面本篇文章就来带大家详细了解一下PHP中的缓存技术。缓存是提高性能最好的方式,例如减少网络I/O、减少磁盘I/O 等,使项目加载速度变的更快。
缓存可以是CPU缓存、内存缓存、硬盘缓存,不同的缓存查询速度也不一样(CPU缓存 > 内存缓存 > 硬盘缓存)。
接下来,给大家逐一进行介绍。
浏览器缓存
浏览器将请求过的页面存储在客户端缓存中,当访问者再次访问这个页面时,浏览器就可以直接从客户端缓存中读取数据,减少了对服务器的访问,加快了网页的加载速度。
强缓存
用户发送的请求,直接从客户端缓存中获取,不请求服务器。
根据 Expires 和 Cache-Control 判断是否命中强缓存。
代码如下:
header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT'); header("Cache-Control: max-age=3600"); //有效期3600秒
Cache-Control 还可以设置以下参数:
- public:可以被所有的用户缓存(终端用户的浏览器/CDN服务器)
- private:只能被终端用户的浏览器缓存
- no-cache:不使用本地缓存
- no-store:禁止缓存数据
协商缓存
用户发送的请求,发送给服务器,由服务器判定是否使用客户端缓存。
代码如下:
$last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']); if (time() - $last_modify < 3600) { header('Last-Modified: '. gmdate('D, d M Y H:i:s', $last_modify).' GMT'); header('HTTP/1.1 304'); //Not Modified exit; } header('Last-Modified: '. gmdate('D, d M Y H:i:s').' GMT');
用户操作行为对缓存的影响
文件缓存
数据文件缓存
将更新频率低,读取频率高的数据,缓存成文件。
比如,项目中多个地方用到城市数据做三级联动,我们就可以将城市数据缓存成一个文件(city_data.json),JS 可以直接读取这个文件,无需请求后端服务器。
全站静态化
CMS(内容管理系统),也许大家都比较熟悉,比如早期的 DEDE、PHPCMS,后台都可以设置静态化HTML,用户在访问网站的时候读取的都是静态HTML,不用请求后端的数据库,也不用Ajax请求数据接口,加快了网站的加载速度。
静态化HTML有以下优点:
- 有利于搜索引擎的收录(SEO)
- 页面打开速度快
- 减少服务器负担
CDN缓存
CDN(Content Delivery Network)内容分发网络。
用户访问网站时,自动选择就近的CDN节点内容,不需要请求源服务器,加快了网站的打开速度。
缓存主要包括 HTML、图片、CSS、JS、XML 等静态资源。
NoSQL缓存
Memcached 缓存
Memcached 是高性能的分布式内存缓存服务器。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
它也能够用来存储各种格式的数据,包括图像、视频、文件等。
Memcached 仅支持K/V类型的数据,不支持持久化存储。
Memcache 与 Memcached 的区别
- Memcached 从0.2.0开始,要求PHP版本>=5.2.0,Memcache 要求PHP版本>=4.3。
- Memcached 最后发布时间为2018-12-24,Memcache 最后发布时间2013-04-07。
- Memcached 基于libmemcached,Memcache 基于PECL扩展。
可以将 Memcached 看作是 Memcache 的升级版。
PHP Memcached 使用手册:
www.php.net/manual/zh/book.memcached.php
Memcached 经常拿来与 Redis 做对比,接下来介绍下 Redis 缓存。
Redis缓存
Redis 是一个高性能的 K/V 数据库。
Redis 很大程度补偿了 Memcached K/V存储的不足,比如 List(链表)、Set(集合)、Zset(有序集合)、Hash(散列),既可以将数据存储在内存中,也可以将数据持久化到磁盘上,支持主从同步。
总的来说,可以将 Redis 看作是 Memcached 的扩展版,更加重量级,功能更强大。
Redis 在日常工作中使用的居多。
MongoDB缓存
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。
旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
WEB服务器缓存
Apache缓存
利用 mod_expires ,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。
打开 php.net/manual/zh/book.apc.php
eAccelerator
eAccelerator:A PHP opcode cache。
感兴趣可以了解下,官方介绍:eaccelerator.net/
XCache
XCache 是一个又快又稳定的 PHP opcode 缓存器。
感兴趣可以了解下,官方介绍:xcache.ligistio.io/
三、布隆过滤器。
四、为不存在的key值,设置空缓存和过期时间,如果存储层创建了数据,及时更新缓存。
雪崩怎么办?
一、互斥锁,只允许一个请求去重建索引,其他请求等待缓存重建执行完,重新从缓存获取数据。
二、双缓存策略,原始缓存和拷贝缓存,当原始缓存失效请求拷贝缓存,原始缓存失效时间设置为短期,拷贝缓存设置为长期。
本文共计1764个文字,预计阅读时间需要8分钟。
缓存已经成为项目中不可或缺的一部分,它是提升性能的绝佳方式。以下章节将详细解析PHP中的缓存技术。
缓存是提升性能的最佳方式,例如减少网络I/O、减少磁盘I/O。
缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式。下面本篇文章就来带大家详细了解一下PHP中的缓存技术。缓存是提高性能最好的方式,例如减少网络I/O、减少磁盘I/O 等,使项目加载速度变的更快。
缓存可以是CPU缓存、内存缓存、硬盘缓存,不同的缓存查询速度也不一样(CPU缓存 > 内存缓存 > 硬盘缓存)。
接下来,给大家逐一进行介绍。
浏览器缓存
浏览器将请求过的页面存储在客户端缓存中,当访问者再次访问这个页面时,浏览器就可以直接从客户端缓存中读取数据,减少了对服务器的访问,加快了网页的加载速度。
强缓存
用户发送的请求,直接从客户端缓存中获取,不请求服务器。
根据 Expires 和 Cache-Control 判断是否命中强缓存。
代码如下:
header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT'); header("Cache-Control: max-age=3600"); //有效期3600秒
Cache-Control 还可以设置以下参数:
- public:可以被所有的用户缓存(终端用户的浏览器/CDN服务器)
- private:只能被终端用户的浏览器缓存
- no-cache:不使用本地缓存
- no-store:禁止缓存数据
协商缓存
用户发送的请求,发送给服务器,由服务器判定是否使用客户端缓存。
代码如下:
$last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']); if (time() - $last_modify < 3600) { header('Last-Modified: '. gmdate('D, d M Y H:i:s', $last_modify).' GMT'); header('HTTP/1.1 304'); //Not Modified exit; } header('Last-Modified: '. gmdate('D, d M Y H:i:s').' GMT');
用户操作行为对缓存的影响
文件缓存
数据文件缓存
将更新频率低,读取频率高的数据,缓存成文件。
比如,项目中多个地方用到城市数据做三级联动,我们就可以将城市数据缓存成一个文件(city_data.json),JS 可以直接读取这个文件,无需请求后端服务器。
全站静态化
CMS(内容管理系统),也许大家都比较熟悉,比如早期的 DEDE、PHPCMS,后台都可以设置静态化HTML,用户在访问网站的时候读取的都是静态HTML,不用请求后端的数据库,也不用Ajax请求数据接口,加快了网站的加载速度。
静态化HTML有以下优点:
- 有利于搜索引擎的收录(SEO)
- 页面打开速度快
- 减少服务器负担
CDN缓存
CDN(Content Delivery Network)内容分发网络。
用户访问网站时,自动选择就近的CDN节点内容,不需要请求源服务器,加快了网站的打开速度。
缓存主要包括 HTML、图片、CSS、JS、XML 等静态资源。
NoSQL缓存
Memcached 缓存
Memcached 是高性能的分布式内存缓存服务器。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
它也能够用来存储各种格式的数据,包括图像、视频、文件等。
Memcached 仅支持K/V类型的数据,不支持持久化存储。
Memcache 与 Memcached 的区别
- Memcached 从0.2.0开始,要求PHP版本>=5.2.0,Memcache 要求PHP版本>=4.3。
- Memcached 最后发布时间为2018-12-24,Memcache 最后发布时间2013-04-07。
- Memcached 基于libmemcached,Memcache 基于PECL扩展。
可以将 Memcached 看作是 Memcache 的升级版。
PHP Memcached 使用手册:
www.php.net/manual/zh/book.memcached.php
Memcached 经常拿来与 Redis 做对比,接下来介绍下 Redis 缓存。
Redis缓存
Redis 是一个高性能的 K/V 数据库。
Redis 很大程度补偿了 Memcached K/V存储的不足,比如 List(链表)、Set(集合)、Zset(有序集合)、Hash(散列),既可以将数据存储在内存中,也可以将数据持久化到磁盘上,支持主从同步。
总的来说,可以将 Redis 看作是 Memcached 的扩展版,更加重量级,功能更强大。
Redis 在日常工作中使用的居多。
MongoDB缓存
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。
旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
WEB服务器缓存
Apache缓存
利用 mod_expires ,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。
打开 php.net/manual/zh/book.apc.php
eAccelerator
eAccelerator:A PHP opcode cache。
感兴趣可以了解下,官方介绍:eaccelerator.net/
XCache
XCache 是一个又快又稳定的 PHP opcode 缓存器。
感兴趣可以了解下,官方介绍:xcache.ligistio.io/
三、布隆过滤器。
四、为不存在的key值,设置空缓存和过期时间,如果存储层创建了数据,及时更新缓存。
雪崩怎么办?
一、互斥锁,只允许一个请求去重建索引,其他请求等待缓存重建执行完,重新从缓存获取数据。
二、双缓存策略,原始缓存和拷贝缓存,当原始缓存失效请求拷贝缓存,原始缓存失效时间设置为短期,拷贝缓存设置为长期。

