线上TP6部署后必须清空runtime目录并关闭模板、路由缓存,否则配置、路由、数据库等修改均不生效;需同步检查伪静态规则是否正确配置。

线上 TP6 必须关 runtime 缓存,否则改配置、加路由、换数据库都不生效——这不是“建议”,是部署后必做的第一件事。
宝塔面板里删 runtime 目录最直接
很多运维误以为“改了 .env 就生效”,结果 APP_DEBUG=false 了还是能看到调试信息,或者数据库改了密码连不上,根源就是 runtime 下的缓存没清。
操作很简单:
- 登录宝塔 → 进入「文件」→ 找到你的网站根目录(比如
/www/wwwroot/your-site.com) - 确认该目录下有
public文件夹(说明你已按规范把运行目录设为/public),然后往上一级找runtime文件夹 - 右键 → 「删除」→ 勾选「强制删除」(避免只删空文件夹)
- 删完立刻刷新网页,如果之前是白屏或报错,大概率会变成“找不到控制器”这类明确提示,说明缓存已清、框架开始重新解析配置
注意:runtime 是自动生成的,删了不影响代码,TP6 会在下次请求时重建必要子目录(如 log、cache)。但如果你用的是多应用模式,确保每个应用目录(如 app/admin/runtime)也都清掉。
立即学习“PHP免费学习笔记(深入)”;
命令行清缓存更可控,适合 CI/CD 或批量操作
宝塔文件管理器有时会卡顿或权限异常,这时 SSH 进去手动清更稳。关键是别只删 runtime,要连带清除 OPCache 和 Composer autoload 缓存。
执行顺序不能乱:
- 先停 PHP-FPM(避免写入冲突):
systemctl stop php-fpm-80(根据你装的 PHP 版本调整,如php-fpm-81) - 再清项目缓存:
rm -rf /www/wwwroot/your-site.com/runtime - 重启 PHP:
systemctl start php-fpm-80 - 如果用了 Composer 自动加载优化(如
composer dump-autoload --optimize),顺手重生成:cd /www/wwwroot/your-site.com && composer dump-autoload
不推荐用 php think clear 命令——它依赖 think 可执行文件且需 CLI 模式 PHP 配置与 Web 一致,线上环境常因禁用函数(如 putenv)或路径问题失败,不如直接删目录来得干净。
关掉模板和路由缓存,避免改了视图/路由不生效
仅删 runtime 不够。TP6 默认开启模板缓存(view_cache)和路由缓存(route_check),这两个在生产环境必须显式关闭,否则你改了 template/index.html 或 route/app.php,页面照样不更新。
修改位置:项目根目录下的 config/app.php
- 把
'template' => ['cache' => true]改成'cache' => false - 把
'route_check' => true改成false - 如果用了多应用,检查对应应用目录下的
config/app.php(如app/admin/config/app.php)是否也同步改了
改完记得再删一次 runtime,否则旧缓存还在,新配置不会被加载。
伪静态没配对,删缓存也没用
常见现象:删了 runtime、关了模板缓存,但访问 /admin/login 还是 404。这时候不是缓存问题,是 Nginx 根本没把请求转发给 index.php。
进宝塔 → 网站 → 你的站点 → 「伪静态」,确认内容是:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
而不是 Apache 风格的 .htaccess 规则,也不是宝塔默认的 ThinkPHP 单应用规则(那个规则不支持多应用前缀)。如果用了多应用(如 /api/v1/user),必须用带正则剥离的版本:
if (!-e $request_filename) {
rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /index.php/$1/$2 last;
rewrite ^/(.*)$ /index.php/$1 last;
}
改完点「保存」,再点「重载配置」——很多人点了保存就以为好了,其实 Nginx 配置没重载,请求还是走旧规则。
真正容易被忽略的点:缓存不是“删一次就一劳永逸”。TP6 的 runtime/log 会长期积累,磁盘满了会导致整个网站 500;多应用模式下各子应用的 runtime 分散在不同路径;还有些人把 public 当作根目录上传,结果 runtime 被建在 public/runtime,根本删错了地方。动手前先 ls -la 确认路径,比事后排查快十倍。



















