21

所以缓存当然是 Magento 中最让我困惑的地方,我相信它对大多数其他人也是如此。目前我们工作的网站之一是企业网站,当然也使用 FPC。问题是,我们有一个每 15 分钟运行一次的库存更新。很多订单都是通过电话和目录发送给 CSR 的,并通过目录进入 Magento 之外的外部系统。

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

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

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

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

即使在销售后库存减少时,如果产品、类别、CMS 发生任何更改,整页缓存也会进入无效状态。

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

但是,如果始终验证 FPC 对于您的业务逻辑来说是必须的,您当然可以将 Magento 安装设置为通过 cron 功能自动刷新它,只要您愿意。

然而,在我所做的所有测试中,在 1.9 和 1.11 Enterprise 上,当 FPC 失效时,响应不会从缓存中拉入。这与他们所说的只是没有更新的更新相矛盾。

有什么我想念的吗?有没有人很好地解释了 Magento 中的失效是如何专门针对 FPC 工作的,或者有任何好的链接可以完全理解流程和代码?

您可以自己尝试对全页缓存的任何页面进行此操作。但据我了解,processRequestin中的方法/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 记录,我不明白为什么这是必要的。这是一个错误吗?

4

4 回答 4

2

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

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

于 2012-06-28T02:33:41.217 回答
2

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

于 2014-01-04T03:27:11.347 回答
0

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

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

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

问题是 Zend 库缓存类和 Magento 企业缓存类在它们的函数中使用了 null 和 false 的混合,这会产生生命周期值。因为 null !== false 总是使用 10 天的默认生命周期。问题源于 app/code/core/Enterprise/PageCache/Model/Processor.php 中的 processRequestResponse 函数。因为在保存时没有将生命周期值传递给缓存实例,所以它默认为 null。

更改 app/code/core/Mage/Core/Model/Cache.php 的 save 函数的生命周期参数的默认值将解决此问题。只需将其设置为 false 而不是 null (上面链接的文章完全解释了原因)。

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

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

于 2013-02-08T10:39:49.577 回答
0

phoenix 页面缓存模块清除产品页面和类别页面,但未发现某些缓存失效区域。它也不能很好地处理动态内容。

也许您应该查看 aoe_static 模块,该模块通过加载默认布局并使用 ajax 调用渲染块,在加载动态内容方面做得很好。此 ajax 调用还将 cookie 设置为允许会话。

你必须小心在一个相当困难的领域使用 2 个模块,也许你应该查看这个magento 开源整页缓存

于 2012-11-07T13:14:54.747 回答