如何minify的PHP页面的HTML输出?

我正在寻找一个PHP脚本或类,可以缩小我的PHP页面的HTML输出,如谷歌网页的速度呢。

我该怎么做?

CSS和Javascript

考虑下面的链接来缩小Javascript / CSS文件: https : //github.com/mrclay/minify

HTML

告诉Apache使用GZip提供HTML – 这通常会将响应大小减less约70%。 (如果使用Apache,configurationgzip的模块取决于您的版本:Apache 1.3使用mod_gzip,而Apache 2.x使用mod_deflate。)

Accept-Encoding:gzip,deflate

内容编码:gzip

使用下面的代码片断 ,通过帮助ob_start的缓冲区从HTML中删除空格:

 <?php function sanitize_output($buffer) { $search = array( '/\>[^\S ]+/s', // strip whitespaces after tags, except space '/[^\S ]+\</s', // strip whitespaces before tags, except space '/(\s)+/s', // shorten multiple whitespace sequences '/<!--(.|\s)*?-->/' // Remove HTML comments ); $replace = array( '>', '<', '\\1', '' ); $buffer = preg_replace($search, $replace, $buffer); return $buffer; } ob_start("sanitize_output"); ?> 

打开gzip,如果你想正确地做。 你也可以做这样的事情:

 $this->output = preg_replace( array( '/ {2,}/', '/<!--.*?-->|\t|(?:\r?\n[ \t]*)+/s' ), array( ' ', '' ), $this->output ); 

通过将您的html转换为一行,没有选项卡,没有新行,没有评论,这将删除约30%的页面大小。 里程可能有所不同

上面所有的preg_replace()解决scheme都有单行注释,条件注释和其他陷阱的问题。 我build议利用经过充分testing的Minify项目,而不是从头开始创build自己的正则expression式。

在我的情况下,我把下面的代码放在PHP页面的顶部来缩小它:

 function sanitize_output($buffer) { require_once('min/lib/Minify/HTML.php'); require_once('min/lib/Minify/CSS.php'); require_once('min/lib/JSMin.php'); $buffer = Minify_HTML::minify($buffer, array( 'cssMinifier' => array('Minify_CSS', 'minify'), 'jsMinifier' => array('JSMin', 'minify') )); return $buffer; } ob_start('sanitize_output'); 

我已经尝试了几个缩小器,他们要么删除太less,要么太多。

此代码删除多余的空白空间和可选的HTML(结束)标记。 此外,它播放它安全,并不会删除任何可能会破坏HTML,JS或CSS的东西。

该代码还演示了如何在Zend Framework中执行此操作:

 class Application_Plugin_Minify extends Zend_Controller_Plugin_Abstract { public function dispatchLoopShutdown() { $response = $this->getResponse(); $body = $response->getBody(); //actually returns both HEAD and BODY //remove redundant (white-space) characters $replace = array( //remove tabs before and after HTML tags '/\>[^\S ]+/s' => '>', '/[^\S ]+\</s' => '<', //shorten multiple whitespace sequences; keep new-line characters because they matter in JS!!! '/([\t ])+/s' => ' ', //remove leading and trailing spaces '/^([\t ])+/m' => '', '/([\t ])+$/m' => '', // remove JS line comments (simple only); do NOT remove lines containing URL (eg 'src="http://server.com/"')!!! '~//[a-zA-Z0-9 ]+$~m' => '', //remove empty lines (sequence of line-end and white-space characters) '/[\r\n]+([\t ]?[\r\n]+)+/s' => "\n", //remove empty lines (between HTML tags); cannot remove just any line-end characters because in inline JS they can matter! '/\>[\r\n\t ]+\</s' => '><', //remove "empty" lines containing only JS's block end character; join with next line (eg "}\n}\n</script>" --> "}}</script>" '/}[\r\n\t ]+/s' => '}', '/}[\r\n\t ]+,[\r\n\t ]+/s' => '},', //remove new-line after JS's function or condition start; join with next line '/\)[\r\n\t ]?{[\r\n\t ]+/s' => '){', '/,[\r\n\t ]?{[\r\n\t ]+/s' => ',{', //remove new-line after JS's line end (only most obvious and safe cases) '/\),[\r\n\t ]+/s' => '),', //remove quotes from HTML attributes that does not contain spaces; keep quotes around URLs! '~([\r\n\t ])?([a-zA-Z0-9]+)="([a-zA-Z0-9_/\\-]+)"([\r\n\t ])?~s' => '$1$2=$3$4', //$1 and $4 insert first white-space character found before/after attribute ); $body = preg_replace(array_keys($replace), array_values($replace), $body); //remove optional ending tags (see http://www.w3.org/TR/html5/syntax.html#syntax-tag-omission ) $remove = array( '</option>', '</li>', '</dt>', '</dd>', '</tr>', '</th>', '</td>' ); $body = str_ireplace($remove, '', $body); $response->setBody($body); } } 

但是请注意,当使用gZip压缩时,您的代码会被压缩得更多,以至于缩小和gZip结合是毫无意义的,因为下载所节省的时间会因缩小而丢失,同时也会减less最小化。

这里是我的结果(通过3Gnetworking下载):

  Original HTML: 150kB 180ms download gZipped HTML: 24kB 40ms minified HTML: 120kB 150ms download + 150ms minification min+gzip HTML: 22kB 30ms download + 150ms minification 

这可以使用PHPWee轻松实现 – 这是免费的开放源码的PHP 5库。

码:

 function sanitize_output($buffer) { require_once ("phpwee-php-minifier/phpwee.php"); return PHPWee\Minify::html($buffer); } ob_start('sanitize_output'); 

笔记

  • 它会把你的HTML整齐,干净的线。
  • 它会将你的HTML(甚至是HTML5)缩小5-20%
  • 它还将缩小CSS和JS资源(高达30%)
  • 免费
  • 其开源(BSD)
  • 它在Github上https://github.com/searchturbine/phpwee-php-minifier
  • 这是composer php是你的风格: https : //packagist.org/packages/searchturbine/phpwee-php-minifier

你可以看看这组类: https : //code.google.com/p/minify/source/browse/? name=master#git%2Fmin%2Flib%2FMinify,你会发现html / css / js缩小在那里上课。

你也可以试试这个: http : //code.google.com/p/htmlcompressor/

祝你好运 :)

在文档根目录外创build一个PHP文件。 如果你的文档根目录是

 /var/www/html/ 

创build一个名为minify.php的文件

 /var/www/minify.php 

复制粘贴下面的PHP代码到它

 <?php function minify_output($buffer){ $search = array('/\>[^\S ]+/s','/[^\S ]+\</s','/(\s)+/s'); $replace = array('>','<','\\1'); if (preg_match("/\<html/i",$buffer) == 1 && preg_match("/\<\/html\>/i",$buffer) == 1) { $buffer = preg_replace($search, $replace, $buffer); } return $buffer; } ob_start("minify_output");?> 

保存minify.php文件并打开php.ini文件。 如果是专用服务器/ VPSsearch以下选项,则在自定义php.ini共享主机上添加它。

 auto_prepend_file = /var/www/minify.php 

参考: http : //websistent.com/how-to-use-php-to-minify-html-output/

你可以看看HTML TIDY – http://uk.php.net/tidy

它可以作为一个PHP模块安装,并将(正确,安全地)删除空白和所有其他nastiness,同时仍然输出完全有效的HTML / XHTML标记。 它也会清理你的代码,这可能是一件好事,或者是一件可怕的事情,这取决于你在编写有效的代码方面有多优秀;-)

另外,您可以在文件的开头使用以下代码对输出进行gzip压缩:

 ob_start('ob_gzhandler'); 

首先gzip可以帮助你比Html Minifier更多

  1. 用nginx :

     gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
  2. 用Apache可以使用mod_gzip

第二:用gzip + Html Minification可以大大减小文件大小!

我已经为PHP创build了这个HtmlMinifier 。

您可以通过composer php检索它: composer require arjanschouten/htmlminifier dev-master

有一个Laravel服务提供商。 如果您不使用Laravel,则可以使用PHP。

 // create a minify context which will be used through the minification process $context = new MinifyContext(new PlaceholderContainer()); // save the html contents in the context $context->setContents('<html>My html...</html>'); $minify = new Minify(); // start the process and give the context with it as parameter $context = $minify->run($context); // $context now contains the minified version $minifiedContents = $context->getContents(); 

正如你所看到的,你可以在这里扩展很多东西,你可以通过各种select。 检查自述文件以查看所有可用的选项。

这HtmlMinifier是完整和安全的。 缩小过程需要3个步骤:

  1. 用占位符replace临时内容。
  2. 运行缩小策略。
  3. 还原原始内容。

我build议你caching你的意见的输出。 缩小过程应该是一次性的过程。 或者,例如,以间隔为基础。

明确的基准不会在当时创build。 但是缩小器可以根据您的标记减less5-25%的页面大小!

如果你想添加你自己的策略,你可以使用addPlaceholderaddMinifier方法。

我有一个GitHub gist包含PHP函数来缩小HTML,CSS和JS文件→ https://gist.github.com/tovic/d7b310dea3b33e4732c0

以下是如何使用输出缓冲区即时缩小HTML输出的方法:

 <?php include 'path/to/php-html-css-js-minifier.php'; ob_start('minify_html'); ?> <!-- HTML code goes here ... --> <?php echo ob_get_clean(); ?> 

如果要删除页面中的所有新行,请使用以下快速代码:

 ob_start(function($b){ if(strpos($b, "<html")!==false) { return str_replace(PHP_EOL,"",$b); } else {return $b;} }); 

感谢安德鲁 。 下面是在CakePHP中使用这个的一个方法:

  1. 下载minify-2.1.7
  2. 解压缩文件并将min子文件夹复制到Cake的Vendor文件夹中
  3. 在Cake的View / Helper中创buildMinifyCodeHelper.php,如下所示:

     App::import('Vendor/min/lib/Minify/', 'HTML'); App::import('Vendor/min/lib/Minify/', 'CommentPreserver'); App::import('Vendor/min/lib/Minify/CSS/', 'Compressor'); App::import('Vendor/min/lib/Minify/', 'CSS'); App::import('Vendor/min/lib/', 'JSMin'); class MinifyCodeHelper extends Helper { public function afterRenderFile($file, $data) { if( Configure::read('debug') < 1 ) //works only e production mode $data = Minify_HTML::minify($data, array( 'cssMinifier' => array('Minify_CSS', 'minify'), 'jsMinifier' => array('JSMin', 'minify') )); return $data; } } 
  4. 在AppController中启用我的助手

    public $ helpers = array('Html','…','MinifyCode');

5 …瞧!

我的结论是:如果你的服务器禁用apache的deflate和headers模块,你的增益就会减less21%,要求压缩的时候增加0.35s(这个数字就是我的情况)。

但是,如果你启用了Apache的模块,压缩的响应没有显着的差异(对我来说是1.3%),压缩的时间是对我来说是0.3s。

那么…我为什么这样做? '我的项目的文档都是在评论(php,css和js),我的最终用户不需要看到这个;)

通过使用passthruexec )来调用它,可以使用经过良好testing的Java缩小器(如HTMLCompressor )。
请记住使用2>&1redirect控制台

但是,如果速度是一个问题,这可能没有用处。 我使用它的静态PHP输出