启用PHP缓存前须先定位真实瓶颈,OPcache适用于字节码加速,APCu适合本机小数据缓存,Redis适合跨进程共享,页面级缓存可由Nginx直接返回静态HTML。

PHP 缓存机制启用前先确认实际瓶颈
直接开缓存不等于提速,反而可能掩盖真实问题。比如页面响应慢是数据库查询拖慢的,加 OPcache 只会让 PHP 解析快一点,但 SQL 还在那儿卡着。建议先用 xdebug 或 blackfire 抓一次请求火焰图,确认耗时集中在「PHP 执行」「IO 等待」还是「网络延迟」。若 70% 时间花在 include 数百个文件或重复 file_get_contents 读配置,才值得动缓存。
OPcache 启用与关键参数调优
这是 PHP 自带字节码缓存,对大多数项目收益最高。Linux 下通常通过 php.ini 启用:
zend_extension=opcache.so opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.validate_timestamps=0 ; 上线后设为 0,开发环境保持 1
注意点:
-
opcache.validate_timestamps=0后必须手动执行opcache_reset()或重启 PHP-FPM 才能更新代码,否则改了文件也看不到效果 -
opcache.max_accelerated_files值太小会导致频繁踢出缓存,可运行php -r "echo opcache_get_status()['opcache_statistics']['max_cached_keys'];"查当前上限 - Docker 环境容易漏掉
zend_extension路径,用php -m | grep opcache确认是否真正加载
用户级缓存:apcu vs redis 的选型逻辑
APCu 适合存「本机进程内」高频小数据,比如配置数组、权限树;Redis 更适合跨进程/多机器共享、带过期策略或大对象(如序列化后的 HTML 片段)。
立即学习“PHP免费学习笔记(深入)”;
APCu 启用只需:
extension=apcu.so apc.enabled=1 apc.shm_size=64M
常见误用:
- 在 CLI 模式下误用 APCu 存 Web 请求数据 —— CLI 进程不共享内存,每次脚本结束就丢
- 把未
serialize()的对象直接塞进apcu_store(),PHP 7.4+ 会报APCu: Cannot store objects - Redis 存 session 时没配
session.save_path="tcp://127.0.0.1:6379?database=1",导致连接默认 DB 0,和其他业务混用引发冲突
页面级缓存绕过 PHP 执行的硬招
如果首页 90% 用户看到的内容完全一致,且更新频率低(如每小时一次),最高效的是让 Nginx 直接返回静态 HTML,彻底跳过 PHP。示例配置:
location / {
try_files /cache/$uri.html @php;
}
location @php {
fastcgi_pass php-fpm;
# ... 其他 fastcgi_param
}对应 PHP 中生成缓存文件:
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/cache/index.html', $html);
关键约束:
- 缓存路径必须可写,且 Nginx 用户(如
www-data)有读权限,否则 403 - 动态内容(如用户昵称、购物车数)必须用 JS 异步加载,不能塞进静态 HTML
- CDN 缓存和本地 Nginx 缓存要分层设置 TTL,避免 CDN 拿到过期 HTML 后本地缓存又不更新
缓存不是开关按钮,而是需要匹配数据生命周期、部署拓扑和访问模式的一组取舍。一个 opcache.enable=1 解决不了所有问题,但漏掉 opcache.validate_timestamps 的生产配置,可能让你花三天查“为什么改了代码不生效”。











