为什么Magento对产品保存中的整页缓存失效实际上使页面没有被缓存以及刷新做什么,因为它没有被缓存

dan*_*des 21 php caching magento redis

所以缓存当然是让我在Magento中最让我困惑的事情,就像我对其他大多数人一样.目前我们工作的网站之一是企业版,当然也使用FPC.问题是,我们有一个每15分钟运行一次的库存更新.通过电话向CSR公司下达了大量订单,并通过目录将订单发送到Magento以外的外部系统.

每15分钟运行一次脚本来检查该系统中的任何库存,看它是否与Magento中的库存不同.如果存在差异,则在Magento中更新库存.使用所有Magento方法,没有sql或类似的东西.

我们一直有缓存问题,并在它们问世时尝试了所有最新技术.我们正在尝试的最新版本是Redis,我们在其他网站上取得了很好的成功.但是,我们仍然看到服务器上出现了疯狂的负载,很明显页面没有被缓存.

在深入研究代码之后,似乎在每个模型保存或管理产品控制器保存后,它会查看是否需要使缓存无效.似乎更改任何属性,至少库存将标记FPC需要失效.

我对失效意味着什么感到困惑,因为不久前我们向客户支持提出了类似问题的问题,这就是回应

即使在销售后库存减少,整页缓存也会在产品,类别,CMS发生任何变化时达到无效状态.

现在,当整页缓存达到无效状态时,这并不意味着您的前端发生了某些变化,但是在上次刷新之后应用的任何更改都不会显示在前端.

但是,如果您的业务逻辑必须始终验证FPC,那么您当然可以设置Magento安装,以便根据需要通过cron功能自动刷新它.

但是,在我所做的所有测试中,在1.9和1.11 Enterprise上,当FPC无效时,会显示响应未从缓存中提取.这与他们所说的只是没有更新的更新是矛盾的.

有什么我想念的吗?有没有人能够很好地解释Magento中的失效如何专门用于FPC或任何良好的链接以完全理解过程和代码?

您可以自己尝试任何整页缓存的页面.但它是我的理解,该方法processRequest/app/code/core/Mage/Core/Model/Cache.php应该设置的主体内容与缓存的响应,如果页面缓存返回true.

要测试转到任何页面,请确保将其缓存并返回true.在我们的案例数量中,进入并编辑产品.这将使FPC无效.但是现在当您加载缓存的页面之前,它将在此方法中返回false而不是缓存页面.我不知道这是否准确无法判断页面是否被缓存,但这是我的调查引导我的地方.如果我错了,请纠正我.

更新:经过进一步调查,我发现当您在管理员中保存产品时,控制器操作

Mage_Adminhtml_Catalog_ProductController::saveAction()

将调用以下方法

Mage::getModel('catalogrule/rule')->applyAllRulesToProduct($productId)

然后在Mage_CatalogRule_Model_Resource_RuleapplyAllRulesForDateRange中调用该方法并触发该事件

catalogrule_after_apply

整页缓存模块正在观察并触发FPC标记的干净缓存方法.基本上删除所有FPC缓存记录.

如果之前的逻辑是清除与产品和类别标签绑定的FPC记录,我不明白为什么这是必要的.这是一个错误吗?

gaz*_*sgo 2

FPC 正在观察库存变化,因为其目的是显示任何已减少至零库存的产品缺货。解决方法是在产品达到零时创建事件调度,而不是每次任何产品更改库存时创建事件调度,并重写 FPC 以观察该事件而不是原始事件。

另一种方法是仅使与正在更新的产品相关的缓存部分无效,但这将是一个相当重要的架构更改。