为什么Magento在产品保存时使整页缓存失效实际上会使页面不缓存,以及刷新由于未缓存而做什么


Why Does Magento Invalidation of Full Page Caching on Product save actually make a page not cached and what does refresh do since it is not cached

所以缓存当然是Magento中最让我困惑的地方,就像我确信的大多数其他人一样。目前,我们工作的网站之一是企业版,当然也使用FPC。问题是,我们有一个每 15 分钟运行一次的清单更新。许多订单通过电话和目录下达给CSR,进入Magento以外的外部系统。

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

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

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

我对无效的含义感到困惑,因为不久前我们向客户支持提出了一个关于类似问题的问题,这就是回应

整页缓存将到达 产品、类别、CMS 发生任何更改后失效状态 即使销售后库存减少。

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

但是,如果始终验证FPC对您来说是必须的 业务逻辑,您当然可以将Magento安装设置为" 通过 cron 功能自动刷新它,就像您一样频繁 欲望。

但是,在

我所做的所有测试中,在 1.9 和 1.11 企业版上,当 FPC 失效时,响应不会从缓存中提取。这与他们所说的只是没有更新的内容相矛盾。

我错过了什么吗?有没有人很好地解释Magento中专门针对FPC的失效如何工作,或者有任何良好的链接来充分理解过程和代码?

您可以自己尝试对任何缓存整页的页面执行此操作。但我的理解是,/app/code/core/Mage/Core/Model/Cache.phpprocessRequest的方法应该使用缓存的响应设置正文内容,如果页面被缓存,则返回 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 记录。这是一个错误吗?

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

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

应创建新的自定义索引器Mage_Index_Model_Indexer_Abstract ,并使用 cron 作业创建新的资源模型 API 方法

Phoenix 页面缓存模块会清除产品页面和类别页面,但会保留一些缓存失效区域。 此外,它不能很好地处理动态内容。

也许您应该查看 aoe_static 模块,该模块通过加载默认布局并使用 Ajax 调用渲染块来很好地加载动态内容。 此 Ajax 调用还将 Cookie 设置为允许会话。

你必须小心在一个非常困难的领域使用2个模块,也许你应该查看这个Magento开源全页缓存

阅读我写的关于Magento中整页缓存的文章。它突出显示了一个错误修复,它突然使整个缓存机制变得有意义!

http://www.excitedcroc.com/article/why-the-magento-full-page-cache-not-expire-not 过期

本质上,Magento使用Zend Framework缓存机制的方式存在错误。

问题是Zend库缓存类和Magento企业缓存类在其函数中使用null和false的混合,从而产生生命周期值。由于 null !== false,因此始终使用 10 天的默认生存期。问题源于 app/code/core/Enterprise/PageCache/Model/Processor.php 中的 processRequestResponse 函数。由于在保存时不会将生存期值传递给缓存实例,因此默认为 null。

更改应用/代码/核心/

法师/核心/模型/缓存保存函数的生命周期参数的默认值.php将解决此问题。只需将其设置为 false 而不是 null(上面链接的文章完全解释了原因)。

- 公共函数 save( $data, $id, $tags = array(), $lifeTime = null )

+ 公共函数 save( $data, $id, $tags = array(), $lifeTime = false )