realpath_cache_size是PHP用于缓存路径解析结果的内存大小,单位字节;过小会导致频繁stat系统调用,显著增加I/O开销、拖慢响应速度,尤其在自动加载和框架初始化阶段。

realpath_cache_size 过小会直接导致 PHP 频繁调用 stat64 或 lstat64 系统调用去解析路径,尤其在循环加载、自动加载或框架初始化阶段,I/O 开销剧增,响应变慢甚至卡顿。
realpath_cache_size 是什么,为什么它影响性能
PHP 每次执行 include、require、file_exists 等操作时,若传入的是相对路径(如 ./config.php 或 ../vendor/autoload.php),需先通过 realpath() 将其转为绝对路径。这个转换过程涉及逐级检查目录是否存在、符号链接是否有效等,本质是多次磁盘 I/O。realpath_cache_size 就是控制这个结果缓存能存多少字节——不是“缓存多少个文件”,而是“最多存多少字节的路径字符串”。
缓存满后,新路径进来会触发 LRU 清除旧条目;若设得太小(比如默认的 16K 或 32K),几轮 autoload 就刷光,等于没缓存。
常见错误现象包括:
- Web 请求首屏时间忽高忽低,尤其在机械硬盘或容器挂载卷上更明显
-
strace -e trace=stat64,openat php index.php显示数百次stat64("/var/www/...", ...) - APM 工具(如 Blackfire)报告大量时间花在
realpath或stream_resolve_include_path
怎么设置合适的 realpath_cache_size 值
不能拍脑袋填 4096K 就完事。实际大小取决于项目中被频繁访问的路径数量 × 平均路径长度(含 null 终止符)。一个 Laravel 项目启动时可能解析 500+ 条路径,平均长度约 80 字节,基础需求就超 40KB。
实操建议:
- 先用
php -r "echo realpath_cache_size();"查当前生效值 - 临时增大到
realpath_cache_size = 8192K(即 8MB),观察strace下的stat64调用次数是否明显下降 - 生产环境推荐起步值:≥
4096K;大型 Composer 项目(含大量 vendor)建议 ≥8192K - 别盲目堆到 16MB 以上——缓存本身也占内存,且 PHP 每个 worker 进程都持有一份副本
realpath_cache_ttl 和 opcache 的协同关系
realpath_cache_ttl 控制缓存条目的存活时间(秒),默认 120。它和 opcache.validate_timestamps 是两套机制,但常被一起动:
- 开发环境可设
realpath_cache_ttl = 5,避免改了文件路径却因缓存不刷新导致require失败 - 生产环境必须配对关闭:设
realpath_cache_ttl = 7200(2 小时) +opcache.validate_timestamps = 0,否则 opcache 不校验文件变更,而 realpath 缓存又过期重查,反而引发更多 I/O - 注意:修改这两个值后,必须重启
php-fpm(systemctl restart php*-fpm),reload不生效
容易被忽略的坑:Docker、mount、symlink 场景
在容器化部署中,realpath_cache_size 容易失效:
- Docker volume 挂载(尤其是
:delegated或:cached)可能导致stat返回缓存结果,让 realpath 缓存误判路径有效性 - 使用
ln -s软链时,realpath 缓存会存储最终目标路径;若软链目标被重建(如部署脚本替换整个release/目录),旧缓存仍指向已删除路径,导致require报错 - NFS 挂载下,
realpath_cache_ttl应适当调低(如 60),避免 NFS 属性延迟引发路径状态不一致
这些场景下,光调大 realpath_cache_size 没用,得配合部署流程清理缓存或改用绝对路径硬编码关键入口(如 require '/app/vendor/autoload.php')。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











