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

wmomyfyw  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(99)

我用的是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,一切都很好。

g52tjvyc

g52tjvyc1#

对象模型有一个clearCache()方法,您可以在产品上使用它。
调用更新查询后,使用以下代码

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

尽管正确的方法是在product对象上设置价格并调用其save()方法。直接修改数据库会跳过所有在保存之前和之后触发的钩子,并且根据您的问题,它也会跳过缓存失效。

相关问题