Silverstripe 3.6缓存刷新不持久问题求助
我来帮你分析下Silverstripe 3.6在本地Mac环境下遇到的这个缓存顽固问题,这种情况我之前也碰到过,大概率是这几个点没处理对:
检查PHP OPcache设置
PHP7.1默认会开启OPcache,它会缓存编译后的PHP脚本——包括Silverstripe模板编译生成的PHP文件。就算你用?flush或?flush=all清除了Silverstripe自身的缓存,OPcache可能还保留着旧的编译文件,导致页面还是显示旧内容。
你可以打开php.ini文件(Mac下通常在/etc/php/7.1/apache2/php.ini),修改以下配置:opcache.enable = 0 ; 临时关闭OPcache,开发环境用这个最省心 # 或者保留开启但实时检查文件变化: opcache.validate_timestamps = 1 opcache.revalidate_freq = 0修改后重启Apache(
sudo apachectl restart)生效。排查Silverstripe自定义缓存配置
检查项目的mysite/_config.php文件,看看有没有手动设置缓存生命周期的代码,比如:SS_Cache::set_cache_lifetime('any', 3600); // 强制设置1小时缓存这种自定义配置可能会让
flush的效果打折扣,或者某些第三方模块的缓存逻辑没有遵循Silverstripe的flush机制,导致旧缓存残留。如果有这类代码,临时注释掉试试。排除浏览器缓存干扰
有时候不是服务器端的问题,而是浏览器缓存了静态资源(比如CSS)。你可以:- 用浏览器的隐私模式访问页面
- 在开发者工具的Network面板勾选“禁用缓存”(刷新页面时保持工具打开)
如果这样能看到最新内容,说明浏览器缓存是元凶。建议开发阶段给CSS/JS文件加版本号,或者用Silverstripe的Requirements类自动处理资源缓存。
确认silverstripe-cache目录权限细节
虽然你说目录有可写权限,但要确保Apache的运行用户(Mac下通常是_www)对该目录有读写执行的完整权限。有时候只给了写权限,但删除旧缓存文件的权限不足,导致flush时旧文件没被清理。
本地开发可以临时执行以下命令测试:sudo chown -R _www:_www silverstripe-cache sudo chmod -R 775 silverstripe-cache
通常来说,OPcache是这个问题的最常见原因,先从这里排查应该能解决问题。
内容的提问来源于stack exchange,提问作者JamesG

