所以缓存当然是 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
in中的方法/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_Rule
类中,applyAllRulesForDateRange
调用该方法并触发事件
catalogrule_after_apply
全页缓存模块正在观察并触发 FPC 标记的清理缓存方法。本质上是删除所有 FPC 缓存记录。
如果在此之前逻辑正在清除与产品和类别标签相关的 FPC 记录,我不明白为什么这是必要的。这是一个错误吗?