开发、生产环境php-fpm进程如何缓存解释执行变化的php代码
1.开发/调试环境(不需要重启php-fpm进程)
1.推荐配置
1 | opcache.enable=1 |
含义:
- 每次请求都会检查文件 mtime
- 文件一变,opcode 立即失效
- volume 改代码 = 立刻生效
👉 这种情况下:
- ❌ 不需要重启 php-fpm
- ❌ 不需要 reload
- ✔ 保存即生效
2 生产环境(需重启php进程,或者worker进程)
1.产配置
1 | opcache.enable=1 |
含义:
- 永远不检查文件是否变化
- opcode 只在进程启动时生成
👉 结果:
- volume 改代码 ❌ 不生效
- 重启 / reload php-fpm ✔ 立刻生效
这不是 Docker 的锅,是 OPcache 的设计。
3. 不重启 php-fpm而重启work进程
1.平滑 reload php-fpm(不是 restart)
1 | kill -USR2 $(cat /run/php-fpm.pid) |
或(Docker 场景):
1 | docker kill -s USR2 php-fpm-container |
效果:
- worker 进程优雅退出
- master 不停
- 重新加载代码 + OPcache
- 几乎无中断
4. 执行链路图
flowchart LR
A[宿主机代码修改] --> B[Docker Volume 同步]
B --> C[容器内 PHP 文件已更新]
C --> D{OPcache 检查时间戳?}
D -- 否 --> E[继续执行旧 opcode]
D -- 是 --> F[重新编译 opcode]
E --> G[表现为代码未生效]
F --> H[代码立即生效]
5.opcache字段解释
开发环境
opcache.validate_timestamps=1opcache.revalidate_freq=0#每次访问检测时间戳- volume 改代码,不用重启
生产环境
opcache.validate_timestamps=0- 发布流程里必须包含 php-fpm reload
- 不建议靠“手动重启容器”解决
1.1 opcache.enable=1
含义:开启 OPcache 扩展
解释:
- OPcache 会把 PHP 脚本编译后的 Opcode(中间字节码)缓存到共享内存
- 避免每次请求都经历「PHP 解析 → 编译 → 执行」
- 对 QPS、CPU 消耗、响应时间都有立竿见影的提升
1表示开启,0表示关闭
👉:生产环境 必开项
1.2 opcache.validate_timestamps=1
含义:是否校验 PHP 文件的修改时间
解释:
1:每次请求时,OPcache 会检查 PHP 文件的mtime(修改时间)- 如果源码发生变化,会自动 重新编译并刷新缓存
0:完全不检查文件变更,只有重启 PHP-FPM 才会生效
适用场景:
1:开发 / 测试环境,频繁改代码0:生产环境,追求极致性能 + 通过发布流程控制重载
1.3 opcache.revalidate_freq=0
含义:检查文件变更的时间间隔(秒)
解释:
- 只有在
opcache.validate_timestamps=1时才生效 0:每一次请求都检查文件是否被修改2:每 2 秒最多检查一次60:每分钟检查一次
这是一个 性能 vs 实时性 的取舍参数
- 三个参数组合在一起的真实行为
2.1 你当前配置的等价语义
开启 OPcache
↓
每一次 HTTP 请求
↓
都去 stat() 检查 PHP 文件时间戳
↓
如果变了,立即重新编译
👉 代码热更新即时生效,但性能并非最优
6.opcache各个环境推荐配置
1.开发 / 联调环境(安全第一)
opcache.enable=1
opcache.validate_timestamps=1
opcache.revalidate_freq=0
特点:
- 改代码立刻生效
- 多一次
stat()系统调用,性能影响可接受
2.生产环境(性能优先)
opcache.enable=1
opcache.validate_timestamps=0
opcache.revalidate_freq=0 ; 此时已无意义
特点:
零文件检查开销
依赖发布流程:
- reload php-fpm
- 或
opcache_reset()
高并发下更稳、更可控