浏览器页面没变,大概率是浏览器自身缓存了html或静态资源,未发送新请求;需先用curl -i验证响应头,再排查thinkphp的html_cache_on、runtime/html/、opcache及模板编译缓存。

浏览器页面没变,不一定是 ThinkPHP 缓存没清,大概率是浏览器自己缓存了 HTML 或静态资源,压根没发新请求——先确认是不是它在拦路。
检查是否被 HTML 静态缓存拦截
ThinkPHP 的 html_cache_on 会生成 runtime/html/ 下的静态 HTML 文件,并直接由 Web 服务器返回,跳过整个框架逻辑。改了模板或控制器,页面却不变,八成是它在生效。
- 临时验证:访问带随机参数的 URL,比如
/index/index?_t=123,如果这次变了,而原路径不变,就是 HTML 缓存生效了 - 关闭方式:在
config/app.php中设'html_cache_on' => false;开发环境可写成'html_cache_on' => app()->isDebug() - 别只删
runtime/cache/,记得也清掉runtime/html/目录
确认静态资源(CSS/JS)是否真更新了
浏览器看到 /static/css/app.css 这个 URL 没变,就会复用强缓存,哪怕你本地文件已重写。服务端没给失效信号,它就默认“还是那个文件”。
- 用
curl -I https://yoursite.com/static/css/app.css看响应头:必须有Content-Type: text/css,且Cache-Control或Expires字段合理(比如含immutable或短过期时间) - 若返回
text/html或 404,说明 Nginx 配置错误——location ^~ /static/必须在所有~ \.php$规则之前,且alias指向public/static(不能用root) - 开发时可用 PHP 时间戳:在模板中写
<link rel="stylesheet" href="/static/css/app.css?v=<?php%20echo%20filemtime(public_path('static/css/app.css'));%20?>">,但注意public_path()必须返回物理路径,不是 URL
排查 PHP 层缓存干扰:OpCache 和模板编译缓存
即使你删了 runtime/,浏览器仍看到旧内容,可能是 PHP 自己把编译后的模板(runtime/view/*.php)或配置文件字节码锁在内存里了。
- OpCache 会缓存
runtime/view/下的 PHP 文件,改完模板后需重启 PHP-FPM 或执行opcache_reset()(开发环境建议关掉 OpCache) - 模板缓存本身是否重编译,取决于
template.cache_expire配置:设为0才会每次检查源文件修改时间;设成'60'或60都会强制缓存 60 秒 -
php think clear默认不清理runtime/view/,TP6.1+ 要用php think clear:template;更干脆的做法是rm -rf runtime/view/(Linux/macOS)或rd /s /q runtime\view(Windows)
绕过一切缓存快速验证真实输出
想立刻知道后端到底吐出什么,就别让任何中间层插手——用命令行直调,排除浏览器、Nginx、OpCache 全部干扰。
- 运行
php think run启动内置服务器(如 TP8),然后用curl http://127.0.0.1:8000/index/index查看原始响应体,和浏览器对比 - 在控制器里加一行
dump(\think\facade\Cache::get('test_key'));,再访问该接口,看输出是否是你预期的值,而不是靠“我以为它该变”来判断 - 如果连
curl返回的也是旧内容,问题一定出在 PHP 代码逻辑或数据库查询上,和缓存无关
最常被忽略的是:你以为清了缓存,其实只是清了某一层;你以为浏览器在请求,其实它连 TCP 连接都没建。动手前,先用 curl 和 curl -I 看清每一层的真实响应,比反复删目录高效得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











