PHP服务器缓存技术主要有文件缓存、OPcache、APCu、Redis、Memcached、页面静态化和CDN缓存,选用哪种取决于你的并发量、数据一致性和预算。
PHP服务器缓存技术有哪些?从代码层到架构层全盘点
代码级缓存:OPcache与APCu
OPcache是PHP官方内置的编译缓存,它把PHP脚本预编译成字节码,省去每次请求的解析时间,配置很简单,打开php.ini,加入以下参数:
opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.validate_timestamps=0
改完重启PHP-FPM:sudo systemctl restart php8.2-fpm,验证是否生效:php -i | grep opcache,业内专家指出,开启OPcache后,PHP脚本执行效率会有肉眼可见的提升。
APCu是用户缓存,常驻内存,适合存配置、字典、小对象,用法:
apcu_store('user_1', $data, 3600);
$data = apcu_fetch('user_1');
注意APCu只在单机有效,多台服务器之间不共享。
数据缓存:Redis与Memcached
Redis和Memcached是PHP项目里最常用的内存缓存,Redis支持字符串、哈希、列表、集合、有序集合,还能持久化,Memcached只做键值缓存,但内存利用率极高。
连接Redis的典型代码:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setex('article_123', 3600, json_encode($article));
$article = json_decode($redis->get('article_123'), true);
连接Memcached:
$mem = new Memcached();
$mem->addServer('127.0.0.1', 11211);
$mem->set('key', $value, 3600);
两者核心差异如下:
| 特性 | Redis | Memcached |
|---|---|---|
| 持久化 | 支持 | 不支持 |
| 数据结构 | 丰富 | 仅键值 |
| 分布式 | 集群、哨兵 | 客户端分片 |
| 内存效率 | 较高 | 极高 |
| 适用场景 | 复杂缓存、排行榜 | 简单键值、会话 |
页面级缓存:静态化与CDN
页面静态化把动态PHP输出存成HTML,步骤:ob_start(); 开始缓冲,生成内容后file_put_contents('cache/'.$id.'.html', ob_get_contents());,下次访问直接读HTML,绕过PHP和数据库。
CDN缓存针对静态资源,设置响应头:header('Cache-Control: max-age=3600');,Nginx反向代理也能做缓存:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m; proxy_cache my_cache; proxy_cache_valid 200 10m;
PHP缓存方案怎么选?Redis、Memcached与文件缓存对比
按数据一致性要求选
- 强一致场景:用Redis加数据库事务,缓存更新时先更数据库再删缓存。
- 最终一致场景:Memcached配合短过期时间,容忍短暂脏数据。
- 本地缓存场景:APCu无网络开销,适合不跨机器的配置数据。
按并发量选
- 日PV几千:文件缓存加OPcache就够,零成本。
- 日PV几万:APCu加单机Redis,数据库压力明显下降。
- 日PV百万:Redis集群加CDN加页面静态化,多级缓存配合。
按预算选
- 零成本:文件缓存、OPcache、APCu。
- 低成本:云服务商基础版Redis,月费几十元。
- 高成本:Redis集群、Memcached集群、CDN流量费,适合大型电商。
中小型网站PHP缓存技术怎么配置?实操步骤与命令
开启OPcache
按前文修改php.ini
,重启服务,用php -i | grep opcache.enable确认。
安装Redis扩展
Ubuntu下:sudo apt install php-redis,编译安装:sudo pecl install redis,然后在php.ini加extension=redis.so,重启PHP-FPM。
编写缓存逻辑
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'home_articles';
if (!$redis->exists($key)) {
$data = $db->query('SELECT FROM articles LIMIT 10')->fetchAll();
$redis->setex($key, 600, json_encode($data));
} else {
$data = json_decode($redis->get($key), true);
}
设置Nginx静态缓存
在nginx.conf的http块加fastcgi_cache_path,在location ~ .php$里加fastcgi_cache my_cache;和fastcgi_cache_valid 200 10m;,重载Nginx:sudo nginx -s reload。
验证缓存命中
redis-cli info stats | grep keyspace_hits看命中次数。tail -f /var/log/nginx/cache.log观察Nginx缓存日志。
PHP缓存技术价格多少?自建与云服务成本分析
自建服务器成本
一台8核16G服务器月租几百元,能跑Redis和PHP,但运维需要专人,故障排查、集群扩容都是隐性成本,相当一部分中小团队低估了人力开销。
云服务成本
简米云Redis基础版1G月费几十元,集群版按规格上涨,酷番云Memcached类似,CDN按流量计费,每GB几毛钱,价格透明,但流量大时费用会快速累积。
免费方案
文件缓存、OPcache、APCu完全免费,缺点也明显:文件缓存有IO瓶颈,APCu不跨机器,适合访问量不大的个人站或内部系统。
价格与性能的平衡
小站优先免费方案,中型站用云Redis基础版加CDN,大型站混合使用,成本需详细核算,多数情况下,缓存带来的服务器成本节省远超缓存本身的支出。
北京地区PHP项目缓存优化有什么讲究?
地域网络延迟
北京机房到华北用户延迟低,但跨运营商可能抖动,选BGP多线机房,配合CDN边缘节点,能明显改善体验。
本地缓存与CDN节点
在北京部署Redis,华北用户读写快,静态资源推送到CDN,减少回源,如果用户全国分布,考虑多地域缓存节点。
合规与数据安全
北京地区对数据出境有要求,缓存敏感数据需本地化,Redis配置requirepass加密传输,避免明文暴露。
常见误区
过度依赖Redis,忽略OPcache和APCu,缓存雪崩:给不同key设置随机过期时间,比如基础时间加随机偏移,缓存穿透:对空结果也设短过期时间,或用布隆过滤器。
PHP服务器缓存技术有哪些常见疑问?Q&A
问题1:PHP缓存技术中,Redis和Memcached哪个更快?
纯读写速度两者接近,Memcached内存利用率略高,但Redis支持更多数据结构和持久化,如果只是简单键值缓存,Memcached足够;需要复杂操作选Redis。
问题2:中小型网站有必要用Redis吗?
日PV低于几千,文件缓存加OPcache就能明显提速,日PV超过几万,数据库压力增大,Redis能有效降低查询次数,可以先从APCu开始,再逐步引入Redis。
问题3:PHP服务器缓存技术如何避免缓存穿透和雪崩?
缓存穿透可对空结果也设置短过期时间,或使用布隆过滤器,缓存雪崩则给不同key设置随机过期时间,Redis集群部署能提升可用性,行业共识认为,缓存策略需要根据业务读写比例动态调整。
选择PHP服务器缓存技术,没有万能方案,关键是匹配业务规模和数据特征,从OPcache和文件缓存起步,再按需引入Redis或Memcached,才能用最小成本换最大性能提升。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/697701.html





