压缩Magento HTML代码

时间:2014-12-13 12:17:40

标签: php magento optimization compression


我正在尝试压缩Magento生成的HTML代码:
Observer.php

        public function alterOutput($observer)
    {
        $lib_path = Mage::getBaseDir('lib').'/Razorphyn/html_compressor.php';

        include_once($lib_path);

        //Retrieve html body
        $response = $observer->getResponse();       
        $html     = $response->getBody();

        $html=html_compress($html);

        //Send Response
        $response->setBody($html);
    }

html_compressor.php

function html_compress($string){

    global $idarray;
    $idarray=array();

    //Replace PRE and TEXTAREA tags
    $search=array(
                    '@(<)\s*?(pre\b[^>]*?)(>)([\s\S]*?)(<)\s*(/\s*?pre\s*?)(>)@',   //Find PRE Tag
                    '@(<)\s*?(textarea\b[^>]*?)(>)([\s\S]*?)(<)\s*?(/\s*?textarea\s*?)(>)@' //Find TEXTAREA
                );
    $string=preg_replace_callback($search,
                                    function($m){
                                        $id='<!['.uniqid().']!>';
                                        global $idarray;
                                        $idarray[]=array($id,$m[0]);
                                        return $id;
                                    },
                                    $string
    );

    //Remove blank useless space
    $search = array(
                    '@( |\t|\f)+@', // Shorten multiple whitespace sequences
                    '@(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+@',   //Remove blank lines
                    '@^(\s)+|( |\t|\0|\r\n)+$@' //Trim Lines
                    );
    $replace = array(' ',"\\1",'');
    $string = preg_replace($search, $replace, $string);

    //Replace IE COMMENTS, SCRIPT, STYLE and CDATA tags
    $search=array(
                    '@<!--\[if\s(?:[^<]+|<(?!!\[endif\]-->))*<!\[endif\]-->@',  //Find IE Comments
                    '@(<)\s*?(script\b[^>]*?)(>)([\s\S]*?)(<)\s*?(/\s*?script\s*?)(>)@',    //Find SCRIPT Tag
                    '@(<)\s*?(style\b[^>]*?)(>)([\s\S]*?)(<)\s*?(/\s*?style\s*?)(>)@',  //Find STYLE Tag
                    '@(//<!\[CDATA\[([\s\S]*?)//]]>)@', //Find commented CDATA
                    '@(<!\[CDATA\[([\s\S]*?)]]>)@'  //Find CDATA
                );
    $string=preg_replace_callback($search,
                                    function($m){
                                        $id='<!['.uniqid().']!>';
                                        global $idarray;
                                        $idarray[]=array($id,$m[0]);
                                        return $id;
                                    },
                                    $string
    );

    //Remove blank useless space
    $search = array(
                    '@(class|id|value|alt|href|src|style|title)=(\'\s*?\'|"\s*?")@',    //Remove empty attribute
                    '@<!--([\s\S]*?)-->@',  // Strip comments except IE
                    '@[\r\n|\n|\r]@', // Strip break line
                    '@[ |\t|\f]+@', // Shorten multiple whitespace sequences
                    '@(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+@', //Remove blank lines
                    '@^(\s)+|( |\t|\0|\r\n)+$@' //Trim Lines
                    );
    $replace = array(' ','',' ',' ',"\\1",'');
    $string = preg_replace($search, $replace, $string);

    //Replace unique id with original tag
    $c=count($idarray);
    for($i=0;$i<$c;$i++){
        $string = str_replace($idarray[$i][0], "\n".$idarray[$i][1]."\n", $string);
    }

    return $string;
}

我的主要观点是两个:

  • 这是一个沉重(或好)的解决方案吗?
  • 有没有办法优化这个?
  • 压缩Magento HTML页面(获取资源和时间与真正的好处)真的有意义吗?

2 个答案:

答案 0 :(得分:1)

我不会评论或审核您的代码。解密regexes(任何风格)不是我最喜欢的爱好。

是的,压缩 HTML 有意义,如果您的目标是提供专业服务。

如果我查看某人网站的HTML代码,其中包含大量无意义的空白内容和用户无用的评论,并且网站不尊重Google's PageSpeed Insights Rules,并且无法使网络更快更环保,那么它说对我来说:要注意,不要相信,当然不要给他们你的信用卡号码

我的建议:

  1. 阅读此问题的答案:Stack Overflow: HTML minification?
  2. 阅读其他开发人员的代码,这是我使用的代码:https://github.com/kangax/html-minifier
  3. benchmark,例如运行Google Chrome > Developer tools > Audits
  4. test如果您的minifier不会无意中破坏页面

答案 1 :(得分:0)

如果你启用了gzip压缩(并且你应该拥有它),那么这样做真的没有意义。它确实浪费了CPU周期。您应该专注于图像优化,减少http请求的数量并设置适当的缓存标头。