如何配置ThinkPHP开发环境,在调试模式下禁用缓存?

2026-04-29 03:262阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1029个文字,预计阅读时间需要5分钟。

如何配置ThinkPHP开发环境,在调试模式下禁用缓存?

开发时模板改了页面不更新?路径加了新规则却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')
  • 推荐做法:只在 .envAPP_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分钟。

如何配置ThinkPHP开发环境,在调试模式下禁用缓存?

开发时模板改了页面不更新?路径加了新规则却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')
  • 推荐做法:只在 .envAPP_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 却早把编译结果钉死在内存里。开发环境禁用缓存,从来不是设一个开关的事,而是逐层确认、同步清理。