opcache.save_comments=1必须启用,因Laravel/Symfony注解路由、Doctrine ORM、PHPStan等工具依赖PHPDoc和属性注释;需同时开启opcache.load_comments=1并重启服务才能生效。

opcache.save_comments 用于控制 OPcache 是否在缓存字节码时保留 PHP 文件中的注释(如 DocBlock、函数说明、@param 等)。在 PHP 8.6 中,该配置的行为与 PHP 7.4–8.5 一致,**默认值仍为 1(启用)**,无需额外操作即可保留注释。
为什么需要保留 save_comments=1?
很多现代 PHP 框架和工具依赖注释实现关键功能:
- Laravel、Symfony 的注解路由或属性路由(
#[Route]、#[AsController])需读取 PHPDoc 或属性 - Doctrine ORM、PHPStan、Psalm、PHP_CodeSniffer 等静态分析/ORM 工具通过反射解析注释
- API 文档生成器(如 Swagger-PHP、ApiGen)必须访问原始注释内容
- 自定义注解处理器或运行时元数据提取逻辑会失效 if
save_comments=0
如何确认它已生效?
仅设 opcache.save_comments=1 不够,还需确保:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 对应 PHP SAPI(如 FPM 或 Apache 模块)的
php.ini中已写入且未被注释:opcache.save_comments=1 -
opcache.load_comments=1同时开启(默认即为 1),否则反射无法读取已缓存的注释 - 修改后已重启 PHP-FPM 或 Web 服务器(重载不生效)
- 用
var_dump(opcache_get_configuration()['directives']['opcache.save_comments']);验证返回值为int(1)
不能设为 0 的典型场景
以下情况务必保持 save_comments=1:
- 项目使用 PHP 8.0+ 属性(
#[Attribute])——它们本质是编译期注释,禁用后属性将丢失 - 启用 OPcache 预加载(
opcache.preload)且预加载文件含注释驱动逻辑 - 使用 Doctrine Annotations 或 Symfony Cache 注解
- CI/CD 流程中运行 PHPStan 或 Psalm 扫描
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










