【发布时间】: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)
我的问题是:
- 这是 Sitecore 在您每次发布时推送共享字段的预期行为吗?
- 当系统项目只有这些默认语言的版本时,Sitecore 会在系统项目上推送共享字段,这是预期的行为吗?
- 如何禁用这些默认语言并删除这些语言的版本? (Powershell?)
- 删除这些默认语言有什么影响?
- 我做错了什么会导致这种行为吗?
UPD。在超过 100k 项阈值并触发完整索引重建的不同环境中,这是非常昂贵的操作。 (有或没有语言后备)
提前致谢!
【问题讨论】:
-
什么是性能问题?您看到了多少增长?
-
禁用语言后备模块后,60k 个项目的 20-30 秒并不多。如果启用了语言回退,那将是一场噩梦,同样数量的项目需要一个多小时。
-
您不可能同时获得所有问题的全面答案。我会将其分成至少两个单独的问题:(1+2+5)、(3+4)。也许您也应该单独询问 Language Fallback 性能问题。