shopware - 使用购物车促销时出现 OOM 和超时

标签 shopware shopware6

当商店拥有大量商品时,由于促销的计算方式,使用促销变得不可能。例如,当全局购物车折扣为 5% 时,对于每个数量,都会将一个单独的行项目加载到内存中。这被调用了 6 次,这不仅会占用大量内存,而且在数量较多时也会变慢。

一旦您的购物车中有超过几百件商品,这就会导致购物车崩溃。

所附屏幕截图是来自购物车的 Blackfire 屏幕截图,其中包含 1 个订单项和 1 个促销事件(在整个购物车上处于事件状态,因此我认为不需要拆分订单项?),数量为 1000。

环境:珠三角

重现步骤:

创建促销事件 将最大购物车限制调高 将数量更改为大数 预期结果:

数量更改有效并且购物车已正确装载 实际结果:

由于站点内存不足,数量没有改变。网站返回 500 错误。

Screenshot Blackfire

最佳答案

这是一个巧妙的收获。我必须承认我对促销计算过程不是很熟悉,但引起我注意的是克隆对象的踪迹,我怀疑它们对于价格计算是必要的(MediaEntityMediaThumbnailCollection )并累积内存消耗。显然,这些对象是为了避免突变而被克隆的,但我无法判断这实际上在多大程度上是必要的。

我快速浏览了 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;

    // ...
}

现在我不确定此更改可能会带来任何不需要的副作用,而且很可能会产生一些副作用。但快速测试似乎产生了相同的结果,但性能有所改进。

之前:
before

之后:
enter image description here

我将传达您的发现,并且我很乐观地认为我们可以找到改进此问题的方法。

关于shopware - 使用购物车促销时出现 OOM 和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73801283/

相关文章:

php - 自定义实体与扩展实体一对一关联

Shopware 6 将自定义字段集添加到 cms-element

rest - Shopware 6 产品 API

shopware6 - Shopware 6 中的 "element-update"是什么意思?

shopware - 如果客户使用 Shopware 6 中的 REST API 注册,则阻止发送注册电子邮件

twig - 如何获取 Shopware 6 中所有其他 channel 的当前产品或类别 url 等效项?

php - 我如何模拟一个应该接受数组的方法?

javascript - 商店用品 6 : Reload a route after saving function using the Administration

shopware - 片段翻译在 offcanvas 中不起作用

shopware6 - 商店软件 6 : how to prove if product has variants