编程更新node的image字段后需清理哪些缓存才可正常显示新图片?
问题根因
该现象由Drupal服务端缓存+浏览器静态资源缓存双重导致:后台表单提交时Drupal会自动触发对应缓存失效,编程操作时未手动处理相关缓存逻辑,就会出现普通刷新不更新、强制刷新才生效的情况:
- 第一层:Drupal页面缓存、渲染缓存、节点关联缓存标签未失效,服务端返回的还是旧页面内容
- 第二层:如果新旧图片文件名完全一致,浏览器会直接复用本地缓存的旧资源,不会向服务器发起新请求
修复步骤
1. 处理旧文件解决浏览器缓存
优先删除原有旧文件,或者给新文件增加时间戳/随机后缀避免重名,也可以直接在图片字段配置中开启重复文件自动重命名功能,从根源避免文件名重复导致的浏览器缓存问题:
// 先获取并删除旧文件 $old_fid = $node->get('field_model_poster')->target_id; if ($old_fid) { $old_file = \Drupal\file\Entity\File::load($old_fid); if ($old_file) { $old_file->delete(); } }
如果确实需要保留相同文件名,可以给图片输出URL加版本查询参数,比如?v=更新时间戳强制浏览器拉取新资源
2. 手动失效节点关联缓存解决服务端缓存问题
$node->save()默认只会清理节点本身的基础缓存,如果节点被视图、区块引用或者站点开启了整页缓存,需要手动触发关联缓存失效:
// 放在$node->save()之后执行 \Drupal\Core\Cache\Cache::invalidateTags($node->getCacheTagsToInvalidate()); // 开启了整页缓存的站点额外加下面一行 \Drupal::service('page_cache_kill_switch')->trigger();
3. 清理对应图片样式缓存
如果该图片字段配置了自定义图片样式,同文件名的新图片不会自动生成新的样式缩略图,需要同步清理对应样式缓存:
// your_image_style_name替换为实际使用的图片样式机读名 $image_style = \Drupal\image\Entity\ImageStyle::load('your_image_style_name'); if ($image_style && isset($old_file)) { $image_style->flush($old_file->getFileUri()); }
完整修复后代码示例
$replace = move_uploaded_file($tmp_name, $poster_dir . '/' . $poster_name); if ($replace) { // 处理旧文件与旧图片样式缓存 $old_fid = $node->get('field_model_poster')->target_id; $old_file = null; if ($old_fid) { $old_file = \Drupal\file\Entity\File::load($old_fid); if ($old_file) { $image_style = \Drupal\image\Entity\ImageStyle::load('your_image_style_name'); if ($image_style) { $image_style->flush($old_file->getFileUri()); } $old_file->delete(); } } $poster_uri = 'public://user_files/' . $owner_id . '/posters/' . $model_id . '/' . $poster_name; $file = File::create([ 'filename' => $poster_name, 'uri' => $poster_uri, 'status' => 1, ]); $file->setPermanent(); $file->save(); $node->set('field_model_poster', ['target_id' => $file->id()]); $node->save(); // 失效节点关联缓存 \Drupal\Core\Cache\Cache::invalidateTags($node->getCacheTagsToInvalidate()); \Drupal::service('page_cache_kill_switch')->trigger(); }
内容的提问来源于stack exchange,提问作者Mikhail Kulbizhekov
相关产品推荐
相关产品推荐

