Drupal 7网站每次页面加载触发缓存清理导致性能骤降求助
我来帮你梳理下这个问题的排查思路——毕竟Drupal 7里system_list_reset()每次页面加载都触发缓存清空,肯定会把性能拖垮到没法用。结合你说的情况,给你几个具体的排查方向:
先排查真正的文件缺失(别信第三方模块的误报)
第三方模块的误报确实坑人,你可以用Drush的官方命令来精准检测:- 运行
drush pm-list --missing:这个命令会直接列出所有状态为启用但实际文件缺失的模块/主题,比第三方工具靠谱多了。 - 或者用
drush status,里面会有一行"Missing modules",能直接看到问题所在。
- 运行
检查模块/主题的.info文件
有时候不是整个模块缺失,而是某个模块的.info文件里声明的文件实际不存在。比如有些模块会在.info里写files[] = custom_helper.inc,但这个文件被误删了,Drupal扫描时发现不匹配,就会触发system_list_reset()。你可以遍历所有启用的模块和主题,核对它们.info里的files项对应的文件是否存在。追踪
system_list_reset()的调用源头
你已经用xhprof看到它调用了cache_clear_all(),但可以再深挖一层:看看是谁触发了system_list_reset()?xhprof的调用栈应该能显示上层调用者——比如是不是某个自定义模块在hook_init()里瞎调用了这个函数,或者某个模块的逻辑有问题,每次页面加载都强制重置系统列表。核对数据库system表的记录
有时候模块卸载不干净,或者system表的记录和实际文件系统不一致,也会导致这个问题。比如某个模块在system表中状态是启用,但实际文件已经被删除了。你可以运行SQL查询:SELECT name, filename FROM system WHERE status = 1;然后逐个核对
filename对应的文件是否真的存在于服务器上。检查Opcode缓存的配置
虽然你说禁用了Drupal的缓存,但服务器层面的Opcode缓存(比如OPcache、APC)如果配置有问题,也可能导致Drupal频繁重新扫描文件,间接触发system_list_reset()。你可以通过phpinfo()查看OPcache的配置,重点看opcache.revalidate_freq(是不是设成了0,导致每次都重新验证文件)、opcache.enable是否开启正常。
先从这几个方向入手,尤其是Drush的缺失模块检测和system表的核对,大概率能找到问题的根源。
内容的提问来源于stack exchange,提问作者l blestel

