用户上传新头像,后台预览已经是新的,前台评论区还是几年前那张,强制刷新才变,换台电脑打开又是旧的。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

$ver = get_user_meta($uid, 'avatar_ver', true) ?: '1';
$url = $avatar_dir . '/u' . $uid . '-' . $ver . '.jpg';
// 上传成功后 update_user_meta($uid, 'avatar_ver', time());

头像文件按固定文件名覆盖,URL 一直没变,浏览器和 CDN 都按缓存里的旧图返回。上传时间戳没参与 URL 拼接,缓存键就没变化。这一点先确认清楚,后面就不用反复试。

「头像更新缓存」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。

具体做法是,头像文件名带上用户 ID 和版本号,覆盖时自然换 URL;输出头像地址时拼一个版本参数,取用户资料的最后修改时间;CDN 侧对头像目录设短缓存,或者上传后主动刷一下;上传后不强制刷新,直接看前台是否更新。

改完照着核一遍,上传后刷新前台头像立刻变,换浏览器打开也是新图。

作者 9823189