在 Magento 2 中执行 bin/magento cache:clean 后页面仍然是旧内容,并不代表命令没有生效。一次前台请求可能依次经过 CDN、Varnish、Magento Full Page Cache、Block HTML、Redis 和浏览器缓存。只清理其中一层,旧响应仍可能从上一层返回。最有效的办法不是反复执行 flush,而是先确认旧内容由哪一层提供。
先做一个不会破坏生产缓存的对照请求
选择一个仍显示旧内容的页面,用查询参数绕过已有的 URL 缓存键,并同时查看响应头:
curl -sSI 'https://shop.example.com/category.html?cache_test=20250307'
curl -sS 'https://shop.example.com/category.html?cache_test=20250307' | grep -n '旧文案'
重点看 Age、X-Magento-Cache-Debug、X-Cache、CF-Cache-Status 等字段。如果普通 URL 是旧内容,而带随机参数的新请求已经更新,问题通常在 Varnish 或 CDN;两个请求都旧,再查 Magento 与数据源。
确认清理的是正确实例和正确缓存类型
php bin/magento cache:status
php bin/magento cache:clean full_page block_html layout config
php bin/magento cache:status
cache:clean 只删除 Magento 标记为相关的缓存条目;cache:flush 会清空当前缓存存储,若同一个 Redis DB 被其他应用共用,flush 可能误伤,所以生产环境不要把它当作常规第一步。多台 Web 节点还要确认命令运行目录与线上节点使用的是同一份 app/etc/env.php。
可对比每台节点的部署版本和配置摘要:
pwd
sha256sum app/etc/env.php
php bin/magento --version
grep -R "cache" -n app/etc/env.php
Redis 中是否存在旧前缀
先从 env.php 读取 Redis 的 host、port、database 与 id_prefix,再对对应 DB 做只读检查。不要在大库上执行 KEYS *:
redis-cli -h 127.0.0.1 -p 6379 -n 1 INFO keyspace
redis-cli -h 127.0.0.1 -p 6379 -n 1 --scan --pattern 'zc:*' | head
如果新旧节点使用不同的 database 或 id_prefix,你在 A 节点清理的缓存不会影响 B 节点。修正配置后先维护模式切流,再清理相关缓存,避免不同节点继续写入两套键空间。
Varnish 与 CDN 分开验证
绕过 CDN,直接请求源站或负载均衡的内网地址,同时保留 Host:
curl -sSI -H 'Host: shop.example.com' http://10.0.2.15/category.html
curl -sS -H 'Host: shop.example.com' http://10.0.2.15/category.html | grep '新文案'
源站已新、公网仍旧,就不应继续清 Magento。Varnish 可检查 BAN/PURGE 是否到达以及对象命中情况;CDN 则按具体 URL 或标签刷新。若响应头的 Age 不断增长,说明旧对象确实还在代理层。
只有某个浏览器旧时检查静态资源和 Service Worker
打开无痕窗口测试,再在开发者工具 Network 中禁用缓存。如果 HTML 已更新但 JS/CSS 仍旧,核对页面引用的静态版本号:
php bin/magento config:show dev/static/sign
find pub/static -maxdepth 2 -name deployed_version.txt -print -exec cat {} ;
PWA 或自定义主题注册过 Service Worker 时,还要在 Application 面板中查看 Cache Storage。仅当确认旧文件由 Service Worker 返回时再注销它,不能用“让所有客户清浏览器缓存”代替修复发布流程。
最后用三种请求回归:公网普通 URL、公网随机参数 URL、源站 Host 请求。三者都出现新内容,且连续两次访问能正常 HIT,才说明缓存链路恢复完整。

