magento开源全页缓存

时间:2012-11-05 22:42:46

标签: magento caching

我最近和一位开发人员说过,即使是默认安装,没有magento CE整页缓存也能正常工作。

我对此的体验是一样的。

如果您使用aoe_static的awesome模块和phoenix的整页缓存与清漆模块,您将会接近。

使用aoe_static模块缓存是基于每个Action完成的,这对我来说似乎是明智的。打孔是通过布局xml应用的占位符和通过ajax调用请求的动态块完成的,不会被缓存。 Cookie也是通过此调用设置的。他提供了一个默认的vcl,它适用于清漆2(我从未检查过),可以很容易地更换为清漆3.

phoenix模块很好地处理了

缓存失效。您可以在模块的控制文件夹中看到这些方法。这样可以在产品或类别更改时处理缓存失效,并使产品页面和类别页面无效。但是,分层导航生成的url可能会被缓存(取决于你的vcl)。这些都没有失效,所以要小心。

在我在生产网站上使用这些模块之前,我真的想知道这些模块是否存在任何其他问题。如果有人能指出我的问题,我会很乐意尝试发布一个解决方案。

但是对于分层导航网址,需要一个模型来记录生成的网址与类别ID。我想有一个2列模型 - 网址和类别 - 很简单,然后缓存失效需要检查模型并使额外的网址无效。这应该在主类别url完成的同时完成。听起来不太糟糕。如果有人得到我非常简短的解释,请在浪费我的时间之前告知我是否遗失了什么。

我宁愿创建一个开源项目,其中包含一些社区帮助(或者更有经验的人),至少在默认的1.7安装中具有(应得的)可靠性声誉。我认为最明智的做法是创建一个包含或记录所有边缘情况(默认为1.7安装)的模块。

有谁知道如何进行这样的任务?如果有更多的社区支持使用apc或memcached执行此操作,这可能对更广泛的主机可用性更为明智。逻辑或开发时间不会有太大变化。

这可以扩展到覆盖应该记住的块的会话缓存,但我认为专注于可靠的整页缓存应该是优先事项。

您还可以检测vcl中的设备。这可以添加到想要移动版https://github.com/varnish/varnish-devicedetect/blob/master/devicedetect.vcl

的商店

我为这个项目创建了一封电子邮件,所以如果你想参与其中,那就是“magefpc gmail com”。任何有magento,git和调试经验的人都会受到欢迎。

谢谢

2 个答案:

答案 0 :(得分:1)

1问题您可能对aoe_static提出的问题是,目前该扩展程序不会记录产品,因此后端中有关已查看产品的统计信息不会更新。这最近作为TODO注释添加到github中。

清漆和magento缓存的问题是,magento缓存部分页面,块和清漆确实缓存了整个页面。所以即使凤凰解决方案有适当的观察员并在产品/类别更新时相应地重置清漆,你仍然有magento块需要重置。 aoe_static尝试解决这个问题,但它仅适用于页面上的可见块。但是,作为分层导航,magento的其他部分可能会在产品/类别更新内部重置,但不会在清漆中重置。 有2个解决方案。要么在前端确定magento的每个部分,而不是在产品/类别更新后重置,并对其应用aoe_static解决方案。这意味着你必须通过ajax加载分层导航。 或者第二个解决方案是,在phoenix扩展中添加更多逻辑以使更多的清漆页面无效。

我有几个自定义扩展(显示产品的页面),我构建逻辑以在每次更新产品/类别时使这些扩展无效。现在我正在进行搜索,因为这也需要失效,但复杂的部分是,解决块和缓存失效逻辑。

总的来说,适当的缓存失效是Web开发中最难的部分之一。

答案 1 :(得分:1)

我希望这篇文章是一个社区答案,详细说明特定句柄的方法,如果它还没有包含在phoenix或aoe_static模块中,则建议使用缓存和失效逻辑。基本上缓存将由aoe_static模块中布置的模块/控制器/动作模式完成,并且Phoenix模块中存在大多数现有的失效。

因此我们需要决定应该通过ajax呈现哪些块以及需要添加高速缓存失效的位置。像gondo说你需要添加更多的失效逻辑来缓存搜索。我计划从目录,cms和aw博客页面开始缩小,这里做了很多,但还需要更多。如果我们也可以在gondo :)的帮助下添加搜索,那就太棒了。

例如,

- 小部件实例可能是一个问题,静态块保存也是如此。只有通过使用core_model_abstract方法_beforeSave()

调度的事件运行总缓存失效,才能轻松解决(就我的快速调查所示)
  Mage::dispatchEvent('model_save_before', array('object'=>$this));

我们需要在使整个缓存失效之前匹配模型的类型。此模式还可以在缓存失效的其他困难区域中实时节省。使用instanceof方法很好,但我们需要知道要检查的模型名称。我猜这里的社区参与度很高,因为代码很容易,但缺少模型。

从前端的角度来看,

小部件基本上是相同的。有产品的那个应该加载aoe_static,因为它们经常变化。但静态的可以被视为静态(html)块。

我们不希望在保存产品时使整个缓存无效,并且无法检查产品是否已包含在窗口小部件中。但是aoe_static模块适用于布局渲染。小部件需要通过布局xml包含在内,而不是像往常一样包含在管理系统中。这些小部件可以添加到呼叫控制器句柄中,并将占位符添加到需要处理的内容中。

完全清漆失效,不时,不是床上用品。如果它经常发生,或者如果在需要时没有发生,则整个缓存失效是一个问题。主要目标应该是捕获管理面板中的每个失效方案和触发通知,与保存产品时相同的消息类型:“一个或多个缓存类型无效......” 这样管理员可以决定是否要手动使缓存无效或等待。和ofc可以根据这种情况建立一些自动失效逻辑。

还必须创建模型来存储由分层导航创建的URL,这些应该与类别视图URL一起失效。

并且通常考虑到分层导航和失效,我们必须在保存属性时使整个缓存无效(我认为)。

我们应该能够将产品评论放在产品页面上而不需要jj用于seo目的。

这意味着当保存评论模型时,必须使用model_save_before事件进行检查,我们应该使产品页面网址无效。 这个保存更改了评级,但我建议在ajax调用中获取此块。这对seo来说并不重要。这适用于产品视图和列表页面。

我们还可以缓存审核模块页面并使其无效,但这对大多数用户来说并不重要,应该等待。

谁想要标签块。这些不能被ajax加载它会破坏它们的目的。与此同时,他们现在不值得我们付出努力。

如果您使用附加的会话ID缓存网址,则会导致用户获取我告知的其他会话。我认为这可以通过基于正则表达式在vcl_fetch中管道来轻松解决。

这个答案越来越混乱,应该很快就会重新起草。随意添加2美分!!