根本原因是 runtime/cache 目录对 web 进程不可写,需递归修改属主(如 www-data)和权限(755),windows 则需在安全策略中为 iis_iusrs 等用户赋予“完全控制”权限。

缓存报错根本不是“清不清”的问题,而是 runtime/cache 目录对 Web 进程不可写——直接删缓存文件或执行 php think cache:clear 顶多是临时掩盖,下次请求照样失败。
Cache::get() 静默返回 null 是权限问题还是配置问题?
两者都可能,但优先排查权限。ThinkPHP 在 file 驱动下遇到写入失败(比如 mkdir 失败、fopen 失败),Cache::get() 不会抛异常,也不报错,就安静地返回 null。你查数据库查半天,其实缓存压根没存进去。
- 先确认是否真在用 file 驱动:检查
config/cache.php里'default' => 'file',且'stores.file.type'是'file' - 再看缓存路径是否存在:
var_dump(config('cache.stores.file.path')),通常输出类似/path/to/runtime/cache - 最后验证该路径是否可写:
is_writable($path)返回false就坐实了权限问题
Linux 下 runtime/cache 权限修复必须分两步走
只改 chmod 或只改 chown 都不完整。Web 进程(如 www-data)既要拥有目录所有权,又要被赋予合理权限位,缺一不可。
- 查 Web 用户:
ps aux | grep -E '(nginx|apache|php-fpm)'看 USER 列;常见为www-data(Ubuntu/Debian)、nginx(CentOS Stream)、apache(RHEL/CentOS 7) - 递归改属主:
sudo chown -R www-data:www-data runtime/cache(把www-data换成你实际的用户) - 设最小权限:
sudo chmod -R 755 runtime/cache;注意:755 对目录有效,文件会自动继承 644,无需额外处理 - 别碰
chmod 777—— 它让其他系统用户也能写,线上等于裸奔
Windows 下 “Permission denied” 错误怎么解?
不是权限数字的事,是 Windows 的 ACL 控制逻辑和 Linux 完全不同。右键属性 → 安全 → 编辑 → 添加当前运行 PHP 的用户(比如 IIS_IUSRS、Users 或具体用户名),勾选“完全控制”,点确定即可。
- 如果用的是 PHPStudy、XAMPP 等集成环境,常因以普通用户启动服务,但缓存目录由管理员创建,导致继承权限不一致
- 更稳妥的做法:以管理员身份重启整个 PHP 环境(比如右键 PHPStudy 启动程序 → “以管理员身份运行”)
- 不要依赖
cacls或 PowerShell 命令强行递归赋权——容易破坏系统目录结构
最易被忽略的是子目录权限:runtime/cache 下的 hash 分片目录(如 a/、ab/)可能被旧进程创建,属主仍是部署用户,Web 进程进不去,也就写不了里面的新缓存文件。所以一定要用 -R 递归操作,不能只修顶层目录。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











