16 mb 是 php 8.6 下 opcache.interned_strings_buffer 的推荐通用值,适用于多数中型项目;设得过大浪费内存且无性能增益,仅在动态类名多、注解繁重或使用率长期超90%时才考虑调高。

opcache.interned_strings_buffer 是 OPcache 中用于缓存“驻留字符串”(interned strings)的内存大小,单位是 MB。这类字符串包括类名、函数名、方法名、常量名、变量名等在运行时高频重复出现的字面量。合理设置能减少内存分配与复制开销,提升性能。
PHP 8.6 下推荐值:16 MB 是较稳妥的通用配置。多数中型项目(几十到几百个类、上千行代码)在此值下已能充分复用字符串,且不会造成内存浪费。
为什么不是越大越好?
该缓冲区是固定大小的共享内存段,一旦设定就全程占用,不会动态伸缩。设得过大(如 64 MB):
- 对小项目明显浪费内存,尤其在容器或低配服务器上;
- 实际驻留字符串总量有限,超出部分始终空闲,无性能增益;
- 可能间接挤压 `opcache.memory_consumption` 可用空间,影响 opcode 缓存容量。
什么情况下可以调高?
仅当满足以下条件之一时,才考虑提升至 32 或 64 MB:
- 项目使用大量动态生成类名/方法名(如深度反射、DSL 框架、AOP 代理);
- 框架重度依赖注解(如 Doctrine Annotations),且注解内容极长、种类繁多;
- 通过
opcache_get_status()观察到interned_strings_usage_ratio长期 > 90%,且存在频繁 GC 或字符串重分配日志。
如何验证是否合适?
启用 OPcache 后,执行以下代码检查实际使用率:
$status = opcache_get_status();
if ($status && isset($status['interned_strings_usage'])) {
$used = $status['interned_strings_usage']['used_memory'];
$free = $status['interned_strings_usage']['free_memory'];
$ratio = round($used / ($used + $free) * 100, 1);
echo "Interned strings usage: {$ratio}%\n";
}稳定运行后若长期低于 70%,说明当前值有余量;若持续高于 95%,再考虑微调。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











