opcache配置篇

就以我自己的腾讯云轻量服务器为例

  • 操作系统:OpenCloudOS 8
  • CPU:2核
  • 内存:2GB
  • 系统盘:SSD云硬盘 50GB
  • 流量包:300GB/月(带宽 4Mbps)

我的php信息

php -v
# 执行结果:
PHP 8.2.19 (cli) (built: Apr 25 2025 12:01:10) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.19, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.19, Copyright (c), by Zend Technologies

如果没有安装opcache请自行安装,咱们只讲如何优化opcache。

opcache属于Zend Engine的一部分,所以需要专门安装;不可以使用pecl install opcache,因为PECL仓库中没有opcache包

开始分析目前的opcache信息

1. 命令行查看opcache信息:

php -i | grep -i "opcache"

会打印出一片opcahce的相关信息;里边能清晰看到opcache的配置文件目录;

2. 我的opcache配置文件目录:

cat /usr/local/php/conf.d/004-opcache.ini

# 输出结果如下:
[Zend Opcache]
zend_extension="opcache.so"

# OPcache 共享内存池的大小,单位 MB;这是存储编译后的字节码(Opcode)的地方
# 对于2G的内存,128M正好
opcache.memory_consumption=128

# 用于存储“驻留字符串”的内存大小,单位 MB;PHP 中有很多重复的字符串(如类名、函数名、数组键)。
# 这个缓冲区让所有进程共享同一份字符串副本,而不是每个进程复制一份。
# 对于2G的内存,8M正好
opcache.interned_strings_buffer=8

# 哈希表中能容纳的最大文件数量(我从4000调成了10000)
# 如果实际 PHP 文件数 > 这个值,OPcache 会停止缓存新文件,且不会报错!这会导致性能突然变差且难以排查。
# 现代框架(Laravel/Symfony)加上 Vendor 目录,轻松超过 4000 个文件。
# 建议调成10000
# 设为 10000 只多占用几 KB 内存,但能确保所有文件都被缓存。这是一个“免费”的性能保险。
pcache.max_accelerated_files=10000

# 检查文件是否被修改的时间间隔(秒)。
# 设为 0 意味着每次请求都检查文件mtime(极慢);
# 设为 -1 或配合 validate_timestamps=0 意味着永不检查(最快,但改代码需重启)。
# 折中方案:60 秒。每 60 秒检查一次文件是否有更新
# 平时性能接近“永不检查”,但在你上传新代码后,最多等待 1 分钟即可自动生效,无需重启服务,非常适合小型团队或个人站长。
# 如果你追求极致性能且习惯手动重启 php-fpm,可以改为 0 并设置 opcache.validate_timestamps=0。
opcache.revalidate_freq=60

# 启用快速关闭机制。
# 在请求结束时,加速内存清理过程。虽然在新版 PHP 中优化效果不如以前明显,但开启它没有任何副作用,属于“开了更好”的选项。
opcache.fast_shutdown=1
opcache.enable_cli=1 # 表示在命令行模式下也开启opcache,这个对脚本任务非常友好

# JIT 编译策略:1255的意义
## 1 (Tracing): 启用追踪 JIT(比函数 JIT 更适合 Web 长运行场景)。
## 2 (Register Allocation): 使用寄存器分配器优化 CPU 指令。
## 5 (Trigger): 基于函数调用次数触发编译(避免冷启动开销)。
## 5 (Optimization Level): 最高优化级别。
# 这是 PHP 官方推荐的通用高性能配置。
# 它对计算密集型代码(如数学运算、图像处理、复杂逻辑循环)有巨大提升。
# 对纯数据库 CRUD 业务提升有限,但也没有负面影响。
opcache.jit = 1255

# 预留给 JIT 编译后的机器码的内存大小。
# 为什么设 32M 而不是 64M/128M:
## 内存账本:
### OPcache 字节码:128 MB
### JIT 机器码:32 MB
### 合计专用内存:160 MB
## 2G 服务器的限制:剩下的 ~1.8GB 要分给操作系统、Nginx、MySQL 和 PHP-FPM 进程堆栈
## 32M 足够吗:对于大多数 Web 应用,JIT 编译后的热点代码很少超过 10-20MB。32MB 是一个安全且高效的值。设太大只会浪费宝贵的 RAM,增加 OOM(内存溢出)风险。
opcache.jit_buffer_size = 32M

总结:这套配置好在哪里?

  • 防溢出:max_accelerated_files=10000 杜绝了因文件多导致缓存失效的隐患。
  • 省内存:jit_buffer_size=32M 和 memory_consumption=128 精确控制了内存上限,保护 2G 小内存服务器不崩溃。
  • 高兼容:revalidate_freq=60 让你在不重启服务的情况下也能在 1 分钟内看到代码更新,运维友好。
  • 全场景加速:enable_cli=1 让定时任务也飞起来。

最后一步:

修改完配置文件后,务必执行:

sudo systemctl restart php-fpm

results matching ""

    No results matching ""