PHP-PHP项目中都有哪些常用的缓存技术呢?

PHP-PHP项目中都有哪些常用的缓存技术呢?

瑾兮 发布于 2017-07-30 字数 99 浏览 1343 回复 9

大家在用PHP做项目开发时都用到了哪些缓存技术?都有些什么需要注意的地方呢?有经验的朋友说说吧~

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

归属感 2017-11-10 9 楼

文件缓存 ,各种缓存插件 比如 memcached redis 或者 shopex开源的secache 也是不错的选择.... 还有就是 页面的静态生成;主要的难点是 缓存策略的制定,这个比较麻烦,得根据你的系统来定义

瑾兮 2017-11-08 8 楼

对于更新不是很频繁的最好是做成HTML静态化,这个静态化可以服务器主动按时更新,也可以由浏览者触发更新;
还有一个就是当只需更新文件中某个板块的时候可以替换而不必重新生成整个文件,减少了数据库的查询次数。

晚风撩人 2017-10-13 7 楼

PHP缓存包括PHP编译缓存和PHP数据缓存两种。产品很多,我只说一下我了解的和用到过的。大家多多补充哇

PHP编译缓存工具:APC,Accelerator等
PHP数据缓存:文件CACHE、Smarty 模板 Cache、MYSQL内存数据表、memcached、Redis、Mongodb、Tokyo Cabinet 等很多

每种都有自己的特性,根据业务来选择吧。

清晨说ぺ晚安 2017-09-27 6 楼

以上同学的回答都是可以优化的方面。我想这里的缓存大概可以分为3个方面:
1、php本身的opcode缓存(XCache、APC)。
2、php运行时需要的数据缓存(内存缓存、磁盘缓存)。
3、对前端机的请求进行缓存(CDN)。

虐人心 2017-09-24 5 楼

一、PHP缓存技术之数据缓存:

这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结 果序列化后保存到文件
中,以后同样的查询结果就直接从缓存文件中获得。

二、PHP缓存技术之页面缓存:

每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问 的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)

三、PHP缓存技术之内存缓存:

在里就不介绍了,不是本文所要讨论的,只简单提一下:

Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

dbcached 是一款基于 Memcached 和 NMDB 的分布式 key-value 数据库内存缓存系统。

以上的缓存技术虽然能很好的解决频繁查询数据库的问题,但其缺点在在于数据无时效性,下面我给出我在项目中常用的方法:

四、PHP缓存技术之时间触发缓存:

检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。

设定时间内不去判断数据是否要更新,过了设定时间再更新缓存。以上只适合对时效性要求不高的情况下使用,否则请看下面。

五、PHP缓存技术之内容触发缓存:

当插入数据或更新数据时,强制更新缓存。

在这里我们可以看到,当有大量数据频繁需要更新时,最后都要涉及磁盘读写操作。怎么解决呢?我在日常项目中,通常并不缓存所有内容,而是缓存一部分 不经常变的内容来解决。但在大负荷的情况下,最好要用共享内存做缓存系统。

到这里PHP缓存也许有点解决方案了,但其缺点是,因为每次请求仍然要经过PHP解析,在大负荷的情况下效率问题还是比效严重,在这种情况下,也许 会用到静态缓存。

六、PHP缓存技术之静态缓存

这里所说的静态缓存是指HTML缓存,HTML缓存一般是无需判断数据是否要更新的,因为通常在使用HTML的场合一般是不经常变动内容的页面。数 据更新的时候把HTML也强制更新一下就可以了。

这篇文章分析的很透彻:http://developer.51cto.com/art/201107/274907.htm

甜柠檬 2017-09-07 4 楼

文件和内存只是存储位置、存取速度不同的同类而已;
真要分类,应该是加速数据存取的数据缓存和重用计算结果的计算缓存,这些都可以单独或者结合应用到从请求到反馈的各个处理环节中;
所以,另一种分类法就是按照应用环节划分;
还可以根据缓存相对于主要处理过程的位置来划分,比如进程内外等等。

晚风撩人 2017-08-31 3 楼

我觉得分为文件型缓存和内存型缓存
文件型如模板引擎smarty的代码和数据缓存,还有程序生成的静态html等
内存型如常用的memcached、APC、Tokyo Cabinet、redis

其它的缓存如浏览器缓存,cdn缓存,mysql查询缓存

浮生未歇 2017-08-11 2 楼

使用Smarty模板做页面缓存的方法很好。

1.使用Smarty模板时应注意支持目录分级,否则一旦cache目录下的文件数量达到数以万计后,CPU遍历目录中文件的时间将巨增。
其次,缓存的过期时间,可以使用smarty处理,配置:

$this->smarty->cache_lifetime=60*60;

若过分追求Web服务器吞吐率,可以不使用Smarty库,自己实现。代码也不复杂的,判断缓存文件是否存在,不存在则写入分级的目录中。经过ab和strace测试,自实现吞吐率有很大提升。因为不用加载Smarty库(降低了磁盘I/O)和对其初始化(降低CPU和内存开销),且读和打开文件的操作次数和执行时间也明显减少。

2.使用局部无缓存技术,即允许在页面中指定一块包含动态数据的HTML的代码段。Smarty也是支持的。配置:

$this->smarty->register_block('dynamic','smarty_block_dynamic',false);
function smarty_block_dynamic($param,$content,&$smarty){
  return $content;
}

3.浏览器和PHP服务端交互缓存,浏览器HTTP头中处理"Last-Modified"、"If-Modified-Since"、“Expires”、"Cache-Control"、“max-age”字段,服务端PHP处理对应字段,比如$_SERVER['HTTP_IF_MODIFIED_SINCE']。

4.对于使用了URL Rewrite(地址重写)技术的,比如Apache的mod_rewrite,请求URL对应的文件被定位到另外一个文件路径中,开启Apache的mod_mem_cache。这是使用磁盘提前缓存映射的结果。

5.对于有大量小文件请求的服务器,缓存打开的文件句柄,读写文件时直接操作缓存句柄。

6.使用反向代理服务器(Varnish)缓存用户经常请求的静态页面,后端使用Lighttpd或Nginx处理Varnish传过来的动态页面请求,Varnish提供一个轻量级的缓存加速功能,相比功能繁重的Squid处理快很多。但是对于动态内容请求比较多的时候显然不适用,因为反向代理都要转发给后端,此时前后端通信造成了延时。所以要分析反向代理的命中率适时使用。

7.使用key-value NoSQL数据库做数据缓存,由于直接操作内存且O(1)的查找,所以广泛应用。但全部缓存进内存,当数据量很大的时候,显然不适用。这时就要使用分布式memcache了。

泛泛之交 2017-08-04 1 楼

像将数据写入文件、使用Smarty模板 Cache、MYSQL内存数据表、memcached、Redis等都是我们日常PHP项目中常用到的一些技术,

另外像静态缓存,如生成HTML静态页面,js数据文件等,也是在搭建高访问、高并发类(如媒体平台)应用中常用到的技术。

在使用缓存时要注意数据的一致性,当数据发生改变时,要强制更新缓存。

对于文件类的缓存,我们可以设置一个过期时间,检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存,可以通过用户的页面访问来触发这一动作。