Drupal 9自定义模块缓存异常:代码更新后旧响应持续返回问题
Drupal 9 自定义模块代码更新后旧响应残留问题排查方案
问题核心本质
你遇到的现象和Drupal自身的页面缓存、渲染缓存机制完全无关,是代码写法不规范触发PHP层缓存残留,和你已做的Drupal缓存配置不冲突,核心匹配特征就是「修改代码后固定等待约2分钟自动生效、清Drupal缓存无效、普通静态文件修改立即生效」,刚好对应PHP默认配置的缓存TTL周期。
排查解决步骤
- 第一优先级:移除控制器内所有
die()/exit()硬中断代码
Drupal 9基于Symfony响应流,必须走完「路由解析→控制器执行→响应过滤→缓存收尾→内容输出」全链路,你在控制器里直接die()会强行切断PHP执行流程,Drupal的缓存重置、PHP的文件状态刷新逻辑全部不会触发,才会导致旧内容残留。
正确的控制器返回写法参考:<?php namespace Drupal\mymod\Controller; use Drupal\Core\Controller\ControllerBase; use Symfony\Component\HttpFoundation\Response; class DemoController extends ControllerBase { public function testPage() { // 原有缓存 kill 逻辑保留即可 \Drupal::service('page_cache_kill_switch')->trigger(); // 禁止用die/exit直接输出,返回标准响应对象 return new Response("hello B - " . rand()); } } - 修正本地开发环境的PHP缓存配置
你遇到的「固定2分钟后才更新代码」现象,完全匹配PHP默认realpath_cache_ttl=120的配置值,加上OPcache的文件校验周期配置共同导致,本地开发环境修改php.ini配置后重启PHP-FPM/服务即可:; 开启OPcache文件时间戳校验 opcache.validate_timestamps = 1 ; 每次请求都检查文件是否更新,开发环境设为0 opcache.revalidate_freq = 0 ; 关闭文件路径缓存TTL,开发环境设为0 realpath_cache_ttl = 0 - 校验现有Drupal缓存配置有效性
你已经在路由中配置的no_cache: TRUE、加上page_cache_kill_switch触发逻辑,已经完全可以关闭当前路由的所有Drupal层缓存,不需要额外在settings.local.php中全局禁用渲染缓存、动态页面缓存,这类全局修改反而会干扰正常缓存逻辑判断,恢复开发模式默认配置即可。 - Docker环境补充校验
你已经验证过普通HTML文件修改立即生效,可排除目录挂载错误问题,只需要确认自定义模块文件在容器内的路径和你本地修改的路径完全一致即可,不需要额外调整容器配置。
验证方式
替换die()写法、调整PHP配置后重启PHP服务,再修改控制器内的输出文本,刷新页面即可立即看到更新内容,不会再出现旧内容残留的问题。
内容的提问来源于stack exchange,提问作者summer
相关产品推荐
相关产品推荐

