【问题标题】:Sitecore updates a lot of items on smart publishSitecore 在智能发布上更新了很多项目
【发布时间】:2016-06-15 00:56:03
【问题描述】:

我正在使用 Sitecore 8.0 Update 5。 每次我使用英语以外的语言进行“智能”发布时,我都可以看到成千上万的项目正在更新。

Job started: Publish to 'web'
Items created: 0
Items deleted: 0
Items updated: 56207
Items skipped: 13057
Job ended: Publish to 'web' (units processed: 69258)

我已启用跟踪,在日志中我可以看到 Sitecore 更新了这些项目的共享字段

##Publish Item: Name=sitecore, Uri=sitecore://master/{11111111-1111-1111-1111-111111111111}?lang=zh&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Shared fields were published.
##Publish Item: Name=templates, Uri=sitecore://master/{3C1715FE-6A13-4FCF-845F-DE308BA9741D}?lang=zh&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Shared fields were published.
##Publish Item: Name=List Manager, Uri=sitecore://master/{D2833213-CB77-431A-9108-55E62E4E47FD}?lang=zh&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Shared fields were published.

对于树中的几乎每个项目,列表都是如此。 借助 dotPeek,我能够在发布管道中找到一种负责确定发布操作的方法:

private void HandleSourceVersionNotFound(Item sourceItem, PublishItemContext context)
{
  Assert.ArgumentNotNull((object) sourceItem, "sourceItem");
  Item targetItem = context.PublishHelper.GetTargetItem(sourceItem.ID);
  if (targetItem != null)
  {
    Item[] versions = targetItem.Versions.GetVersions(true);
    if (versions.Length > 0 && versions.Any(v => v.Language != sourceItem.Language)) || Settings.Publishing.PublishEmptyItems)
      context.Action = PublishAction.PublishSharedFields;
    else
      context.Action = PublishAction.DeleteTargetItem;
  }
  else if (Settings.Publishing.PublishEmptyItems)
    context.Action = PublishAction.PublishSharedFields;
  else
    context.AbortPipeline(PublishOperation.Skipped, PublishChildAction.Skip, "No publishable source version exists (and there is no target item).");
}

在这里我们可以看到它检查项目版本,如果有英语以外的语言版本,它会将操作设置为 PublishAction.PublishSharedFields。 在我的情况下,Settings.Publishing.PublishEmptyItems 设置为 false,因此这不应触发共享字段发布。

我认为我的解决方案中唯一具有非英语版本的“系统”项目是语言,但是当我查看日志中的一个项目时,我发现了一件非常有趣的事情: Sitecore default languages

这些似乎是 Sitecore 的“默认”语言。

当我启用语言后备模块时,此行为会导致发布性能问题。 (https://marketplace.sitecore.net/en/modules/language_fallback.aspx)

我的问题是:

  1. 这是 Sitecore 在您每次发布时推送共享字段的预期行为吗?
  2. 当系统项目只有这些默认语言的版本时,Sitecore 会在系统项目上推送共享字段,这是预期的行为吗?
  3. 如何禁用这些默认语言并删除这些语言的版本? (Powershell?)
  4. 删除这些默认语言有什么影响?
  5. 我做错了什么会导致这种行为吗?

UPD。在超过 100k 项阈值并触发完整索引重建的不同环境中,这是非常昂贵的操作。 (有或没有语言后备)

提前致谢!

【问题讨论】:

  • 什么是性能问题?您看到了多少增长?
  • 禁用语言后备模块后,60k 个项目的 20-30 秒并不多。如果启用了语言回退,那将是一场噩梦,同样数量的项目需要一个多小时。
  • 您不可能同时获得所有问题的全面答案。我会将其分成至少两个单独的问题:(1+2+5)、(3+4)。也许您也应该单独询问 Language Fallback 性能问题。

标签: sitecore sitecore8


【解决方案1】:

这是 Sitecore 在您每次发布时推送共享字段的预期行为吗? => 否,但您找到的代码并非用于每个项目。当在 web 中但不在 master 中找不到源版本时,将发生该操作。这就是为什么它要么发布共享字段(以防其他版本确实存在),要么从网络上完全删除该项目(因为它不再存在于 master 中)。

当系统项目只有这些默认语言的版本时,Sitecore 在系统项目上推送共享字段是否是预期的行为? => 如果没有更深入的调查,我无法按原样回答这个问题,我很抱歉目前没有时间。

如何禁用这些默认语言并删除这些语言的版本? (Powershell?) => 这些语言没有注册,它们出现是因为这些项目确实有这些语言的版本。因此,如果您删除这些语言的所有系统项目的版本,它们将不再显示。您可以通过代码创建任何语言的版本,甚至是不存在的版本。

删除这些默认语言有什么影响? => 任何使用该语言的内容编辑器可能会突然看到英语(或剩余语言),而不是他们首选的 Sitecore 编辑语言。除此之外,它应该无关紧要。

我做错了什么会导致这种行为吗? => 到目前为止,我无法从您所介绍的内容中看到。

【讨论】:

    【解决方案2】:

    如何禁用这些默认语言并删除这些语言的版本?

    如果该语言在 /sitecore/system/Languages 下注册,如果您删除该语言,Sitecore 应删除该语言的所有项目版本。

    如果该语言未在 /sitecore/system/Languages 下注册(或 Sitecore,由于某种原因,在您删除它时无法删除它),请执行数据库清理(控制面板 > 数据库 > 清理数据库)。 Sitecore 将删除使用未注册语言的任何版本的项目。

    删除这些默认语言有什么影响?

    除非您计划在未来使用这些语言,否则没有实际意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-11
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多