php缓存需按类型区分配置:opcache优化脚本执行,apcu缓存单机变量,页面缓存静态html,redis/memcached实现分布式共享;各类型对应不同参数与使用场景,不可混用。

PHP缓存参数设置需按缓存类型区分,核心是明确目标:提升脚本执行速度、减少数据库压力,还是加快页面响应。不同层级的缓存对应不同配置位置和关键参数,不能混用。
OPcache(字节码缓存)——PHP脚本执行加速
这是最基础也最关键的缓存,作用于PHP解析编译阶段。它把编译后的字节码存在内存里,避免每次请求都重读文件、词法分析、生成opcode。在 php.ini 中配置以下几项:
-
opcache.enable=1:必须开启,CLI环境可额外设opcache.enable_cli=1 -
opcache.memory_consumption=128:分配128MB共享内存,中大型项目建议128–256 -
opcache.max_accelerated_files=4000:缓存文件上限,应略高于项目实际PHP文件数(可用find . -name "*.php" | wc -l估算) -
opcache.revalidate_freq=60:开发环境设为1或0,生产环境设60–300秒,控制检查文件更新的频率 -
opcache.validate_timestamps=0:生产环境务必关闭时间戳验证,否则每次请求都触发stat系统调用,抵消性能收益;改代码后手动调用opcache_reset()刷新 -
opcache.fast_shutdown=1和opcache.optimization_level=0x7FFFBFFF:启用快速关闭与全部优化(PHP 7.4+)
配置完重启 PHP-FPM 或 Apache/Nginx,用 phpinfo() 或 opcache_get_status() 验证是否生效。
APCu(用户数据缓存)——单机高频变量存储
适合缓存配置项、统计数、API结果等无需跨服务器共享的数据。它不依赖外部服务,纯内存操作,延迟极低。在 php.ini 中启用并配置:
-
extension=apcu.so(Linux/macOS)或extension=php_apcu.dll(Windows) apc.enabled=1-
apc.shm_size=128M:分配128MB共享内存 -
apc.ttl=3600:默认过期时间1小时,写入时也可单独指定 -
apc.enable_cli=1:方便命令行调试
代码中使用示例:
apcu_store('site_config', $config, 3600);
$data = apcu_fetch('site_config'); // 命中返回值,未命中返回false
注意:APCu仅限本机进程间共享,不适合分布式部署。
页面缓存(输出级缓存)——整页HTML静态化
适用于变动不频繁的前端页面(如首页、文章详情页),直接缓存最终HTML输出,跳过全部PHP逻辑和数据库查询。典型实现方式(无需扩展):
- 在入口文件开头调用
ob_start() - 生成唯一缓存路径,例如:
$cacheFile = 'runtime/cache/' . md5($_SERVER['REQUEST_URI']) . '.html' - 检查缓存是否存在且未过期(如
filemtime($cacheFile) > time() - 1800表示30分钟内有效) - 若有效,
readfile($cacheFile); exit(); - 若无效,继续执行,最后用
file_put_contents($cacheFile, ob_get_contents()); ob_end_flush();
关键点:
- 缓存路径要有写权限(如
chmod 755 runtime/cache) - 动态内容(如登录状态、购物车)需用JS异步加载,避免整页缓存导致信息错乱
- URL带参数时,确保
$_SERVER['REQUEST_URI']包含完整查询串,或手动拼接参数哈希
数据缓存(Redis/Memcached)——跨进程/跨机器共享数据
用于会话、热点列表、排行榜等需要多实例一致性的场景。ThinkPHP、Laravel等框架通常封装了统一接口,但底层依赖正确连接配置。以 Redis 为例,在 php.ini 中确认已启用扩展:
-
extension=redis.so(Linux)或extension=php_redis.dll(Windows)
应用层配置重点:
-
host和port必须可达(Docker环境注意用宿主机IP或host.docker.internal) -
prefix建议设置非空值(如myapp_),防止多个项目键名冲突 -
serialize选项若启用,需确保序列化格式兼容(推荐php或json) - 过期时间
expire推荐设正整数秒,避免用0(永不过期)或负数(部分驱动不识别)
示例(原生Redis):
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setex('user_123', 3600, json_encode($userInfo));
不复杂但容易忽略:缓存键名不要含空格、斜杠、中文,否则在 file 驱动下写入失败无提示,建议统一 md5($key) 或只用字母数字下划线。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











