我正在使用 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,一切都可以正常工作。
对象模型有一个
clearCache()
方法,您可以在产品上使用。
调用更新查询后使用以下代码
$params['product']->clearCache();
尽管正确的方法是在产品对象上设置价格并调用其
save()
方法。直接修改数据库会跳过保存前后触发的所有挂钩,并且根据您的问题,它也会跳过缓存失效。