开发、生产环境php-fpm进程如何缓存解释执行变化的php代码

1.开发/调试环境(不需要重启php-fpm进程)

1.推荐配置

1
2
3
opcache.enable=1
opcache.validate_timestamps=1
opcache.revalidate_freq=0

含义:

  • 每次请求都会检查文件 mtime
  • 文件一变,opcode 立即失效
  • volume 改代码 = 立刻生效

👉 这种情况下:

  • ❌ 不需要重启 php-fpm
  • ❌ 不需要 reload
  • ✔ 保存即生效

2 生产环境(需重启php进程,或者worker进程)

1.产配置

1
2
opcache.enable=1
opcache.validate_timestamps=0

含义:

  • 永远不检查文件是否变化
  • 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字段解释

  1. 开发环境

    • opcache.validate_timestamps=1
    • opcache.revalidate_freq=0 #每次访问检测时间戳
    • volume 改代码,不用重启
  2. 生产环境

    • 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 实时性 的取舍参数


  1. 三个参数组合在一起的真实行为

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()
  • 高并发下更稳、更可控