如何配置ThinkPHP开发环境,在调试模式下禁用缓存?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1029个文字,预计阅读时间需要5分钟。
开发时模板改了页面不更新?路径加了新规则却404?不是你代码写错了,是缓存没关——ThinkPHP的缓存分了好几层,关错一层就白忙活了。
为什么 APP_DEBUG = true 还不生效?检查配置优先级
很多人在 .env 里写了 APP_DEBUG=true,但页面还是不报错、不显示 SQL 日志。根本原因是:动态代码或配置文件里的设置会覆盖它。
-
config/app.php中的'app_debug' => false会直接压掉.env的值 -
App::debug(true)这类运行时调用优先级最高,哪怕.env是 false 也会强制开启 - 验证当前真实状态:执行
php think env:show或在控制器里打印config('app.app_debug') - 推荐做法:只在
.env设APP_DEBUG=true,删掉config/app.php里所有关于app_debug的硬编码
template.cache_expire 设为 0 才真禁用模板缓存
模板文件明明保存了,runtime/view/ 下的缓存 PHP 文件却没重生成?问题大概率出在 template.cache_expire 默认是 60(秒),不是“关闭”。
- 设成
'template.cache_expire' => 0(必须是整数 0,不是字符串'0')才代表“每次检查源文件时间戳” - Linux 下快速连点保存可能因文件系统时间精度(如 ext4 的 1 秒粒度)被判定为“未修改”,可手动
touch template/index.html强刷时间戳 - 如果用了
$this->fetch($name . '_edit')这类拼接路径,框架根本不会缓存——这不是禁用,是压根没触发缓存逻辑 - 确认是否真走缓存:打开
'template.debug' => true,查runtime/log/里有没有Template cache file日志行
别只清 runtime/view/,runtime/html/ 和 opcache 也得清
清完 runtime/view/,页面还是旧的?大概率是 HTML 静态缓存或 PHP opcache 在捣鬼。
立即学习“PHP免费学习笔记(深入)”;
-
html_cache_on是独立开关,默认可能为true,必须显式设为false(在config/app.php或通过app()->isDebug()动态判断) -
runtime/html/目录存的是完整 HTML 输出缓存,和模板缓存无关,也要一并删掉 - opcache 会缓存
runtime/view/*.php这些已编译文件,开发时建议在php.ini中关掉:opcache.enable=0,或至少设opcache.revalidate_freq=0 - Nginx/Apache 层也可能返回 304,临时调试可在控制器里加:
header('Cache-Control: no-cache, no-store');
路由缓存必须关两次:生成缓存文件 + 关闭运行时检查
加了新路由,php think route:list 能看到,但访问 404?说明路由缓存没刷新,或者还在用旧缓存。
- 先确保
app_debug = true,否则php think route:cache命令根本不执行 - 开发阶段,直接删掉
runtime/route/route.php,再把config/app.php里的'route_check_cache' => true改成false - 如果用了注解路由,
route.annotation_paths配置错误会导致扫描失败,route:cache命令静默跳过,要查日志 - 注意:闭包定义的路由(如
Route::get('test', function(){}))无法参与route_check_cache,关了也没用
最常被忽略的是:你以为关的是模板缓存,实际拦路的是 HTML 静态缓存;你以为清了 runtime,opcache 却早把编译结果钉死在内存里。开发环境禁用缓存,从来不是设一个开关的事,而是逐层确认、同步清理。
本文共计1029个文字,预计阅读时间需要5分钟。
开发时模板改了页面不更新?路径加了新规则却404?不是你代码写错了,是缓存没关——ThinkPHP的缓存分了好几层,关错一层就白忙活了。
为什么 APP_DEBUG = true 还不生效?检查配置优先级
很多人在 .env 里写了 APP_DEBUG=true,但页面还是不报错、不显示 SQL 日志。根本原因是:动态代码或配置文件里的设置会覆盖它。
-
config/app.php中的'app_debug' => false会直接压掉.env的值 -
App::debug(true)这类运行时调用优先级最高,哪怕.env是 false 也会强制开启 - 验证当前真实状态:执行
php think env:show或在控制器里打印config('app.app_debug') - 推荐做法:只在
.env设APP_DEBUG=true,删掉config/app.php里所有关于app_debug的硬编码
template.cache_expire 设为 0 才真禁用模板缓存
模板文件明明保存了,runtime/view/ 下的缓存 PHP 文件却没重生成?问题大概率出在 template.cache_expire 默认是 60(秒),不是“关闭”。
- 设成
'template.cache_expire' => 0(必须是整数 0,不是字符串'0')才代表“每次检查源文件时间戳” - Linux 下快速连点保存可能因文件系统时间精度(如 ext4 的 1 秒粒度)被判定为“未修改”,可手动
touch template/index.html强刷时间戳 - 如果用了
$this->fetch($name . '_edit')这类拼接路径,框架根本不会缓存——这不是禁用,是压根没触发缓存逻辑 - 确认是否真走缓存:打开
'template.debug' => true,查runtime/log/里有没有Template cache file日志行
别只清 runtime/view/,runtime/html/ 和 opcache 也得清
清完 runtime/view/,页面还是旧的?大概率是 HTML 静态缓存或 PHP opcache 在捣鬼。
立即学习“PHP免费学习笔记(深入)”;
-
html_cache_on是独立开关,默认可能为true,必须显式设为false(在config/app.php或通过app()->isDebug()动态判断) -
runtime/html/目录存的是完整 HTML 输出缓存,和模板缓存无关,也要一并删掉 - opcache 会缓存
runtime/view/*.php这些已编译文件,开发时建议在php.ini中关掉:opcache.enable=0,或至少设opcache.revalidate_freq=0 - Nginx/Apache 层也可能返回 304,临时调试可在控制器里加:
header('Cache-Control: no-cache, no-store');
路由缓存必须关两次:生成缓存文件 + 关闭运行时检查
加了新路由,php think route:list 能看到,但访问 404?说明路由缓存没刷新,或者还在用旧缓存。
- 先确保
app_debug = true,否则php think route:cache命令根本不执行 - 开发阶段,直接删掉
runtime/route/route.php,再把config/app.php里的'route_check_cache' => true改成false - 如果用了注解路由,
route.annotation_paths配置错误会导致扫描失败,route:cache命令静默跳过,要查日志 - 注意:闭包定义的路由(如
Route::get('test', function(){}))无法参与route_check_cache,关了也没用
最常被忽略的是:你以为关的是模板缓存,实际拦路的是 HTML 静态缓存;你以为清了 runtime,opcache 却早把编译结果钉死在内存里。开发环境禁用缓存,从来不是设一个开关的事,而是逐层确认、同步清理。

