【问题标题】:Disable/Bypass Magento Full Page Cache on single page在单页上禁用/绕过 Magento 整页缓存
【发布时间】:2011-12-06 18:55:25
【问题描述】:

如何禁用或绕过单个页面的 FPC?我不想使用打孔,因为页面上有几个块我需要是动态的,我宁愿修改一个配置/类来指定不应该缓存整个页面(类似于结帐的行为)。

我对 FPC 的理解是它不用于“会话用户”(登录、添加到购物车等)。但是,当用户登录时,我发现 FPC 会影响页面。如果我禁用 FPC,则页面会按预期工作。

【问题讨论】:

    标签: caching magento


    【解决方案1】:

    这是为特定控制器禁用 FPC 的解决方案(也可以扩展到特定操作)。

    首先创建一个观察者来监听controller_action_predispatch事件:

    public function processPreDispatch(Varien_Event_Observer $observer)
    {
        $action = $observer->getEvent()->getControllerAction();
    
        // Check to see if $action is a Product controller
        if ($action instanceof Mage_Catalog_ProductController) {
            $cache = Mage::app()->getCacheInstance();
    
            // Tell Magento to 'ban' the use of FPC for this request
            $cache->banUse('full_page');
        }
    }
    

    然后将以下内容添加到模块的 config.xml 文件中。这在<frontend> 部分:

    <events>
        <controller_action_predispatch>
            <observers>
                <YOUR_UNIQUE_IDENTIFIER>
                    <class>YOURMODULE/observer</class>
                    <method>processPreDispatch</method>
                </YOUR_UNIQUE_IDENTIFIER>
            </observers>
        </controller_action_predispatch>
    </events>
    

    现在 Magento 每次都会为您的页面提供服务,并绕过 FPC 处理请求。

    【讨论】:

    • 如果我想将它用于 CMS 页面怎么办?我可以在 CMS 页面的更新 xml 中使用 xml 部分,但我不知道在类标签中写什么
    • Thx,我挖掘了 FPC 的代码,到目前为止,这看起来是最好的方法。有趣的入口点可能是Mage_PageCache_Model_Processor,但它不能被覆盖,因为它是用new .. 初始化的(至少在开始时......第二次使用sigleton......)
    • 谁能告诉我,我应该写什么而不是“你的唯一标识符”?谢谢 :)
    • @Chesterliterally_anything_you_want_as_long_as_it_is_unique。虽然通常你至少应该在它前面加上你的模块的短名称。
    【解决方案2】:

    刚刚完成与 Magento EE FPC 的角力,不在缓存的 CMS 页面上显示核心消息。核心消息在缓存类别和产品页面上运行良好,但在 CMS 页面上运行良好。我发现通过将某个参数传递给页面,您可以强制生成该页面,而不是从缓存中生成服务器。

    发现于:app/code/core/Enterprise/PageCache/Model/Processor/Default.php

    /**
     * Disable cache for url with next GET params
     *
     * @var array
     */
    protected $_noCacheGetParams = array('___store', '___from_store');
    

    因此,可以创建一个包含绕过 FPC 的 HTTP GET 查询字符串的链接。

    http://www.domain.com/?___store
    

    这有助于解决我遇到的问题,即插件重定向到带有会话消息的引荐网址,但如果引荐来源是 CMS 页面,则在查看非 CMS 页面之前不会显示消息。

    【讨论】:

    • 如果绕过 FPC,拥有数十万种产品的商店将经历沉重的服务器负载,这使其成为 DDOS 攻击的潜在载体。有没有办法防止这种行为?
    • 同意这可能是大型目录的潜在问题。看起来像一个自定义模块来改变这种行为将是一种方式。
    • 通常在处理 EE FPC 缓存消息时,这是因为您可能正在尝试使用 getGroupedHtml() 输出它们。您只需要使用 toHtml() 即可确保 Enterprise 保持打孔消息正常工作。
    【解决方案3】:

    Magento 的 FPC 是一种复杂的野兽。

    我已经使用以下教程克服了这个问题:

    http://oggettoweb.com/blog/customizations-compatible-magento-full-page-cache/

    这可能就是您所说的“打孔”,但这是我发现的唯一克服它的方法。

    【讨论】:

    • 是的,就是打孔。我尝试按照链接中的说明进行操作,但我不断收到:“致命错误:达到 '200' 的最大函数嵌套级别,正在中止!” (数字无关紧要。我试过增加最大值,但它只是不断地达到它)启用 FPC 时。看起来某处有一个疯狂的循环。如果我关闭 FPC,一切都会恢复正常。
    • 这就是为什么单链接答案不好。网址已死,您的回答毫无用处。
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    相关资源
    最近更新 更多