PHP网页持续被缓存,禁用Opcache、APC及配置缓存规则后仍未解决
- 首先排查Apache自带的缓存模块是否开启
你之前只配置了缓存头,若Apache开启了mod_cache、mod_cache_disk/mod_cache_mem等服务端缓存模块,会直接返回缓存内容不执行PHP逻辑。可执行以下命令检查模块:
apache2ctl -M | grep cache
如果返回了缓存相关模块,执行a2dismod cache cache_disk cache_mem禁用后重启Apache即可。
- 检查是否存在上层代理/CDN缓存
如果你的站点接入了CDN、Nginx反向代理或者服务商自带的站点加速服务,普通请求会直接命中节点缓存,而Shift+F5强制刷新会携带no-cache头回源请求。你可以在服务器本地执行curl请求测试:
curl -v http://127.0.0.1/你的PHP页面路径
多次执行如果返回内容每次都动态更新,说明问题出在上层节点缓存,调整对应节点的缓存规则即可。
排查Apache配置的头冲突问题
你在全局Apache配置中添加的Header set Cache-Control "max-age=0, public"规则,优先级高于PHP代码输出的头,其中public属性允许所有中间节点缓存响应内容,和你PHP中配置的no-store规则直接冲突。同时你.htaccess里的缓存规则仅匹配了html、js、css等静态文件,未覆盖PHP文件。建议先删除Apache全局的那条Cache-Control配置,再测试访问。检查浏览器响应状态和头信息
打开浏览器F12控制台的「网络」面板,查看普通访问时的响应状态码:如果是304,说明浏览器认为本地缓存未过期;如果是200 (from disk cache/from memory cache),说明返回的是本地缓存。同时检查响应头中的Cache-Control值是否符合你预期的配置,确认没有被中间层篡改。排查其他PHP缓存扩展或框架缓存
你仅禁用了Opcache和APC,还需检查是否存在XCache、eAccelerator等其他缓存类扩展,执行php -m可查看所有已加载的扩展。同时确认你的PHP项目是否启用了框架自带的页面缓存、静态缓存功能,或者自研的文件缓存逻辑。排查第三方服务端缓存组件
检查服务器是否部署了Varnish、Redis页面缓存等第三方缓存组件,这类组件默认会缓存动态响应内容,普通请求不会走到PHP逻辑。
内容的提问来源于stack exchange,提问作者immeckro

