runtime和storage目录必须可写但不可Web访问,关键是对齐Web进程用户权限;应通过chgrp与g+w赋权而非777,Docker需确保UID一致,Mac需将目录加入_www组并开放组写权限。

runtime 和 storage 目录必须可写,但不能裸露在 Web 可访问路径下,也不能用 root 或 777 一刀切。关键在于“谁在写”和“谁在读”要对齐。
明确目录用途与安全边界
ThinkPHP 默认将缓存、日志、模板编译等写入 runtime/;上传文件、自定义存储等建议放 storage/uploads(非 public 下)。这两个目录天然不应被浏览器直接访问——只要不把它们放在 Nginx/Apache 的 root 或 alias 路径里,就基本隔绝了 PHP 脚本执行风险。
Linux / 宝塔 / Docker 环境通用设置法
权限不是固定数字,而是匹配运行用户:
- 查 Web 服务用户:Apache 常用
_www(macOS)或www-data(Ubuntu/Debian),Nginx 多为www或nginx - 查当前目录属主:
ls -ld runtime storage - 设属组并加写权限(推荐):
sudo chgrp -R www-data runtime storagesudo chmod -R g+w runtime storage - 目录权限设为
755,内部文件无需单独改(框架会自动创建)
Docker 容器内特别处理
宿主机 UID 和容器内用户不一致是 90% 权限报错的根源:
立即学习“PHP免费学习笔记(深入)”;
- 构建镜像时就授权:
RUN mkdir -p /var/www/runtime /var/www/storage && chown -R www-data:www-data /var/www/runtime /var/www/storage - 运行容器时指定用户:
docker run -u www-data ... - 挂载方式要分离:
-v ./app:/var/www:ro(代码只读)-v ./runtime:/var/www/runtime(单独挂载可写)
Mac 系统常见修复步骤
Apache 用 _www 组,但你的项目文件属主是个人用户:
- 把 storage/runtime 加入
_www组:sudo chgrp -R _www storage runtime - 开放组写权限:
sudo chmod -R g+w storage runtime - 确认 Apache 配置未禁用组权限(如
Require all granted已启用)



















