Magento:如何压缩HTML输出?

9
有没有一个文件在 Magento 中,可以输出所有的 HTML 代码?
我想要压缩所有的 HTML 输出。

1
好问题,+1,但是你想如何压缩HTML? - Pekka
5个回答

19

Magento使用响应对象来发送所有输出。

所有输出都会添加到该对象中,然后调用其sendResponse方法。

如果您想要更改输出,则可为http_response_send_before事件设置侦听器。

<!-- in your module's config.xml -->
<http_response_send_before>
    <observers>
        <unique_name>
            <type>singleton</type>
            <class>group/observer</class>
            <method>alterOutput</method>
        </unique_name>
    </observers>
</http_response_send_before>

然后在您的观察者中,您可以获取并设置主体内容

class Packagename_Modulename_Model_Observer
{
    public function alterOutput($observer)
    {
        $response = $observer->getResponse();       
        $html     = $response->getBody();           
        //modify html here          
        $response->setBody($html);
    }
}

如果你感兴趣,这个事件在以下类的sendResponse方法中被调用。

app/code/core/Mage/Core/Controller/Response/Http.php

输出本身是通过sendResponseoutputBody方法发送的。

lib/Zend/Controller/Response/Abstract.php   

我已经使用了上述代码,但似乎无法与完整页面缓存一起使用 :( - Bijal Bhavsar

5

理想情况下,您应该在输出缓存之前执行代码压缩以避免频繁执行。我能想到的最好的方式是通过覆盖Mage_Page_Block_Html并向您的新类添加以下函数来实现:

protected function _toHtml()
{
    $html = parent::_toHtml();
    // MINIFY CONTENTS OF $html HERE
    return $html;
}

这样一来,它就可以为整个页面执行操作,返回值可以按照Magento通常的方式进行缓存。它不是针对每个块单独执行操作,这可能效率较低。


4

您可以始终使用ob函数在index.php中获取输出,然后对内容进行任何需要的处理。但我怀疑它是否能像启用gzip或deflate一样提升您的网站性能。


@Simon说你必须编辑index.php,但只要你是代码所有者并对所做的任何编辑负责,你可以随心所欲地进行任何操作。 - Anton S
错误...这正是您的答案所建议的。而且,依我之见,您永远不应该编辑核心。绝对不行。 - Simon

2
也许谷歌的mod_pagespeed可以帮到你,它可以自动化地实现这一点。无论如何,gzip和deflate都很不错。

mod_pagespeed是为这种情况而设计的。然而,它仍在每个请求上执行。 - clockworkgeek
非常正确,我喜欢利用整页缓存来节省时间的想法。您对mod_pagespeed上HTML压缩需要多少时间有什么想法吗?我不知道这会是多大的问题。 - Joe Mastey
因为它是本地代码,所以必须比脚本版本更快。当然还有其他缓存选项,例如mod_disk_cache和mod_mem_cache,尽管我不确定它们是否在mod_pagespeed之后实例化,或者您可以使用反向代理。这些类型的缓存选项通常需要Expires和Vary标头,而Magento没有设置它们,因此它们的有用性可能受到限制。基本上我不知道,只有调试配置文件工具才能告诉您。 - clockworkgeek

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接