当商店拥有大量商品时,由于促销的计算方式,使用促销变得不可能。例如,当全局购物车折扣为 5% 时,对于每个数量,都会将一个单独的行项目加载到内存中。这被调用了 6 次,这不仅会占用大量内存,而且在数量较多时也会变慢。
一旦您的购物车中有超过几百件商品,这就会导致购物车崩溃。
所附屏幕截图是来自购物车的 Blackfire 屏幕截图,其中包含 1 个订单项和 1 个促销事件(在整个购物车上处于事件状态,因此我认为不需要拆分订单项?),数量为 1000。
环境:珠三角
重现步骤:
创建促销事件 将最大购物车限制调高 将数量更改为大数 预期结果:
数量更改有效并且购物车已正确装载 实际结果:
由于站点内存不足,数量没有改变。网站返回 500 错误。
最佳答案
这是一个巧妙的收获。我必须承认我对促销计算过程不是很熟悉,但引起我注意的是克隆对象的踪迹,我怀疑它们对于价格计算是必要的(MediaEntity
、MediaThumbnailCollection
)并累积内存消耗。显然,这些对象是为了避免突变而被克隆的,但我无法判断这实际上在多大程度上是必要的。
我快速浏览了 LineItemQuantitySplitter
,尝试实例化一个新的 LineItem
并重新分配原始实例的属性。
public function split(LineItem $item, int $quantity, SalesChannelContext $context): LineItem
{
/** @var LineItem $tmpItem */
$tmpItem = LineItem::createFrom($item);
if ($item->getQuantity() === $quantity) {
// return clone $item;
return $tmpItem;
}
// $tmpItem = clone $item;
// ...
}
现在我不确定此更改可能会带来任何不需要的副作用,而且很可能会产生一些副作用。但快速测试似乎产生了相同的结果,但性能有所改进。
我将传达您的发现,并且我很乐观地认为我们可以找到改进此问题的方法。
关于shopware - 使用购物车促销时出现 OOM 和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73801283/