在我的自定义 PrestaShop 1.7 模块中更新产品价格时如何使 Memcached 值无效?

问题描述 投票:0回答:1

我正在使用 Prestashop 1.7 multistore。其中一家商店启用了增值税,而另一家则没有。我创建了一个挂接到

updateproduct
钩子的自定义模块。在此模块中,我更新了产品的价格,但仅限于没有增值税的商店。这确保了两家商店的最终价格相同。

为了提高性能,我使用 Memcached。但我很难正确地使缓存失效。一旦非增值税存储的值被缓存(我在模块中更改的值),在尝试在产品管理中再次设置它后它就永远不会改变。它在数据库中正确更改,但 Memcached 检索旧值。如何使 Memcached 中的存储值失效或更新?我也不知道如何获取正确的 Memcached 密钥,因为它是一个哈希,例如 ps_288e7d9f7adabca7ca488166fced130a。

目前,我发现刷新 Memcached 的唯一方法是使整个缓存失效,这在性能方面似乎是一个次优的解决方案。

Cache::getInstance()->delete('*');

这是我简化的更新价格的钩子函数:

private function updateProductPrice($params)
    {
        $id_product = $params['id_product'];
        $price = $params['product']->price;
        $id_tax_rules_group = $params['product']->id_tax_rules_group;

        $shop_ids = $this->getShopIds();

        $tax_rate = $this->getTaxRate($id_tax_rules_group);

        foreach ($shop_ids as $shop_id) {
            $is_tax = Configuration::get('PS_TAX', null, null, $shop_id);
            $sql = 'SELECT `price`
                FROM `' . _DB_PREFIX_ . 'product`
                WHERE `id_product` = ' . (int) $id_product;
            $base_price = (float)Db::getInstance()->getValue($sql);
            
            if (!$is_tax) {
                $new_price = $base_price * (100 + $tax_rate) / 100;
                Db::getInstance()->update('product_shop', ['price' => $new_price], 'id_product = '.(int)$id_product . ' AND id_shop = '.(int)$shop_id);
            }
        }
    }

如果没有启用 Memcached,一切都可以正常工作。

php prestashop memcached prestashop-1.7
1个回答
0
投票

对象模型有一个

clearCache()
方法,您可以在产品上使用。

调用更新查询后使用以下代码

$params['product']->clearCache();

尽管正确的方法是在产品对象上设置价格并调用其

save()
方法。直接修改数据库会跳过保存前后触发的所有挂钩,并且根据您的问题,它也会跳过缓存失效。

© www.soinside.com 2019 - 2024. All rights reserved.