缓存文件读取失败主因是php进程无权进入目录,需确保runtime及其子目录(cache、home等)对web用户有执行权限(x)且属主一致;执行chmod o+x逐级赋权并chown -r www-data:www-data runtime/,禁用777,selinux环境需配置httpd_sys_rw_content_t上下文。

ThinkPHP 5.0 在 Linux 下用 File 缓存驱动时,缓存文件读取失败,通常不是“找不到文件”,而是 PHP 进程无权读取已存在的缓存文件——根源在权限配置错位,尤其体现在属主不一致和执行权限缺失上。
缓存文件读取失败的典型表现
报错类似:
_STORAGE_WRITE_ERROR_: ./Runtime/Cache/Home/xxxx.php
或页面空白、模板不渲染、部分接口返回空,但日志里没有明显错误。
注意:这类问题常只影响特定模块(如 Home、Admin)、特定请求(如带某参数的 URL),并非全站失效——说明缓存文件已生成,但 PHP 无法进入目录或打开文件。
关键原因:目录可进入性(x 权限)被忽略
Linux 中,要读取 Runtime/Cache/Home/xxx.php,PHP 进程必须能:
- 进入 Runtime 目录(需该目录有 x 权限)
- 进入 Cache 子目录(同样需 x)
- 进入 Home 子目录(仍需 x)
- 最后才有权读取 xxx.php 文件(需 r)
缺任一环节的 x 权限,就会静默失败,不提示“无读权限”,而表现为“文件不存在”或白屏。
- 运行
ls -ld Runtime Runtime/Cache Runtime/Cache/Home,检查每级权限第三位(other)是否含 x。若显示drw-r--r--,说明 other 没有 x,必须补上 - 执行
chmod o+x Runtime Runtime/Cache Runtime/Cache/Home(或统一chmod 755 Runtime并确保子目录继承) - 别只改 Home 目录:很多人只 chmod 777 Home,却忘了 Cache 和 Runtime 本身不可进入
属主错配:缓存文件由 root 创建,www 用户打不开
ThinkPHP 的 File 驱动会按缓存 key 的 MD5 前两位自动建子目录(如 fa/)。如果曾用 root 执行过 php think 命令(如清缓存、跑队列),root 就创建了 fa/ 目录;后续网页请求由 www-data 用户发起,虽有读权限,但无法进入 root 所有、且组/other 无写权限的目录——导致新缓存写不进、旧缓存也读不了(因 PHP 尝试校验并可能重建)。
- 查当前 Web 用户:
ps aux | grep php-fpm | head -1 | awk '{print $1}' - 递归修正属主:
sudo chown -R www-data:www-data Runtime/(把 www-data 替换为你环境的实际用户) - 避免复发:所有后台任务(Crontab、Supervisor)必须用
sudo -u www-data php think xxx运行
安全权限设置建议(非 777)
线上环境禁用 chmod 777。正确组合是:
- 目录统一设为
755:find Runtime/ -type d -exec chmod 755 {} \; - 文件统一设为
644:find Runtime/ -type f -exec chmod 644 {} \; - 确保
Runtime/及其全部子目录属主为 PHP-FPM 实际用户(非 Nginx 用户) - 若启用了 SELinux(CentOS/RHEL),还需运行:
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/path/to/your/project/Runtime(/.*)?"; sudo restorecon -Rv /path/to/your/project/Runtime
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











