我用的是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,一切都很好。
1条答案
按热度按时间g52tjvyc1#
对象模型有一个
clearCache()
方法,您可以在产品上使用它。调用更新查询后,使用以下代码
尽管正确的方法是在product对象上设置价格并调用其
save()
方法。直接修改数据库会跳过所有在保存之前和之后触发的钩子,并且根据您的问题,它也会跳过缓存失效。