tp6在宝塔下runtime写入失败的根本原因不是权限数字小,而是属主/组不匹配、scandir被禁用或open_basedir限制;正确做法是先chown为www:www,再设目录755、文件644,最后确保scandir未被禁用并重启php。

别设 runtime 为 777,TP6 在宝塔下写不进日志或缓存,根本原因不是权限数字不够大,而是所有者错、组错、或 scandir 被禁用。
为什么 runtime 目录设成 777 反而可能失效
Linux 下 PHP 进程以 www 用户运行,但如果你上传的项目文件属主是 root:root 或 nginx:nginx,哪怕 chmod 777,内核仍会按「用户匹配优先」原则拒绝写入(尤其开启 SELinux 或某些安全策略时)。更常见的是:777 会触发宝塔或 PHP 的 open_basedir 限制、被安全模块拦截,或让 file_put_contents() 报 Permission denied 却不报具体路径。
- 777 不解决属主问题,只掩盖权限配置错误
- TP6 启动时要 scan
config/、app/等目录,若scandir()被禁用,直接白屏,和runtime权限无关 - 宝塔后台“权限”按钮批量设 777,会跳过
.env、.git和符号链接真实路径,导致部分子目录仍不可写
正确设置 runtime 目录的三步顺序不能颠倒
必须按「改属主 → 设目录权限 → 开放写位」顺序操作,漏一步都会失败:
- 执行
chown -R www:www /www/wwwroot/your-site/runtime(确认路径准确,别多写斜杠) - 执行
find /www/wwwroot/your-site/runtime -type d -exec chmod 755 {} \;(确保每一级目录都有 x 位) - 执行
find /www/wwwroot/your-site/runtime -type f -exec chmod 644 {} \;(日志文件本身不需要执行权) - 最后单独给
runtime目录加写权限:chmod 755 /www/wwwroot/your-site/runtime(不是 777,755 已足够)
检查 scandir 是否被禁用 —— TP6 白屏最常被忽略的点
宝塔默认在 PHP 配置里禁用 scandir,TP6 容器初始化时会调用它扫描 config/ 和 provider/ 目录,一旦缺失就卡在 autoload 阶段,页面空白且无错误提示。
- 进宝塔 → 软件商店 → 找到你站点用的 PHP 版本 → 设置 → 配置修改
- 搜索
disable_functions,删掉其中的scandir(保留exec、system等其他函数没问题) - 改完必须「重启 PHP」,不是「重载配置」——在 PHP 设置页点【服务】→【重启】
- 顺手检查
date.timezone = Asia/Shanghai,否则runtime/log/里的日志时间全乱
验证是否真生效:看 logs/thinkphp.log 而不是浏览器
TP6 的权限错误几乎从不在页面上显示,所有写入失败、扫描失败、路由加载失败都默默记在 runtime/log/thinkphp.log 里。打开这个文件,如果看到 Call to undefined function think\scandir() 或 failed to open stream: Permission denied,说明上面三步里至少漏了一环。别信“页面能打开就代表 OK”,runtime 写不进,缓存不生效、SQL 日志不记录、异常堆栈不落盘,后期排障会极其被动。











