ThinkPHP 8.1 安装后必须手动设置权限,runtime/ 和 public/ 目录需可读写(Linux/macOS 执行 chmod -R 755 runtime/ public/,Windows 授予 IIS_IUSRS 或服务账户“修改”权限),.env 推荐 644 权限且属主与 Web 进程一致,vendor/ 和 app/ 需确保 r-x 权限,部署后须用 chown 对齐 runtime/ 属主。

ThinkPHP 8.1 安装后必须手动设权限,否则 runtime 目录写入失败、.env 无法保存、调试模式打不开——不是“建议”,是运行前提。
runtime/ 和 public/ 目录必须可写
TP8.1 启动时会自动在 runtime/ 下生成 log/、cache/、session/ 等子目录;public/ 下的 index.php 是唯一入口,Web 服务器必须能读取它。两者权限不到位,直接白屏或 500 错误。
- Linux/macOS:进项目根目录执行
chmod -R 755 runtime/ public/(若仍报写入失败,临时改775,上线前回调) - Windows:右键
runtime/→ 属性 → 安全 → 编辑 → 给 IIS_IUSRS(IIS)或 Users(Apache/Nginx 服务账户)勾选“修改”和“写入” - 宝塔面板用户:站点【设置】→【网站目录】→ 勾选“防跨站攻击(open_basedir)”,再点【权限设置】→ 将
runtime/设为 755,所有者设为www
.env 文件权限不能是 777,但必须可被 PHP 进程读取
安装时自动生成的 .env 若权限过高(如 777),Nginx/Apache 可能直接把它当静态文件返回给浏览器,泄露数据库密码;若权限过低(如 600),PHP CLI 或 Web SAPI 就读不到配置,APP_DEBUG=true 不生效,错误全黑盒。
- 推荐权限:Linux/macOS 设为
644,所有者与 Web 进程一致(如www:www) - 验证方式:在
public/index.php开头加一行var_dump(file_get_contents(__DIR__.'/../.env'));,能输出内容说明可读 - 宝塔用户注意:上传后别用面板“批量修改权限”功能一键设整个项目为 755,它会把
.env也改成 755,需单独右键修改
不要忽略 vendor/ 和 app/ 的读取权限
虽然不常写,但 vendor/ 下的 autoload.php、app/ 下的控制器和中间件都得被 PHP 正常 include。某些 Linux 发行版(如 CentOS)默认 umask 为 027,导致新解压目录只有 owner 可读。
立即学习“PHP免费学习笔记(深入)”;
- 检查命令:
ls -ld vendor/ app/,确认权限包含r-x(如drwxr-xr-x) - 修复命令:
chmod -R u+rx,g+rx,o+rx vendor/ app/(不开放写,只保读+执行) - Docker 部署时:在
Dockerfile中加RUN chmod -R 755 /var/www/html/vendor /var/www/html/app,避免挂载卷覆盖权限
最易被跳过的其实是 runtime/ 子目录的属主问题——即使权限是 755,若属主不是 Web 进程运行用户(如 www-data 或 nginx),照样写不进去。每次部署完,务必用 ps aux | grep nginx 或 ps aux | grep apache 确认服务进程用户,再用 chown -R www:www runtime/ 对齐。



















