我正在寻找一个可以减少我的php页面html输出的php脚本或类,就像google page speed一样。
我怎样才能做到这一点?
<pre>
或<code>
标记不起作用,因为它们需要空格来确保适当的结构。但是,<script>
通常应在外部使用,也可以在内部使用,但必须;
严格使用,这样它也可以使用。其他哪些标签可能会破坏@Brad?我想不起其他人。我应该在之前的评论之前添加快速而肮脏的方式。
我正在寻找一个可以减少我的php页面html输出的php脚本或类,就像google page speed一样。
我怎样才能做到这一点?
<pre>
或<code>
标记不起作用,因为它们需要空格来确保适当的结构。但是,<script>
通常应在外部使用,也可以在内部使用,但必须;
严格使用,这样它也可以使用。其他哪些标签可能会破坏@Brad?我想不起其他人。我应该在之前的评论之前添加快速而肮脏的方式。
Answers:
考虑以下链接以最小化Javascript / CSS文件: https //github.com/mrclay/minify
告诉Apache使用GZip交付HTML-通常将响应大小减少约70%。(如果使用Apache,则配置gzip的模块取决于您的版本:Apache 1.3使用mod_gzip,而Apache 2.x使用mod_deflate。)
接受编码:gzip,放气
内容编码: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");
?>
$content = \Minify_HTML::minify($content);
,甚至可以向内联代码的js / css压缩器添加回调)。见github.com/mrclay/minify/blob/master/min/lib/Minify/HTML.php
<script>
没有;
在每个语句末尾或没有使用注释的内联JavaScript(即,标记中)//
如果要正确执行,请打开gzip。您还可以执行以下操作:
$this->output = preg_replace(
array(
'/ {2,}/',
'/<!--.*?-->|\t|(?:\r?\n[ \t]*)+/s'
),
array(
' ',
''
),
$this->output
);
通过将您的html变成一行,没有制表符,没有新行,没有注释,这可以删除大约30%的页面大小。里程可能会有所不同
preg_replace()
上面所有解决方案都有单行注释,条件注释和其他陷阱的问题。我建议利用经过充分测试的Minify项目而不是从头开始创建自己的正则表达式。
就我而言,我将以下代码放在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');
我已经尝试了多个缩小器,它们要么删除得太少,要么删除得太多。
此代码删除了多余的空格和可选的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 (e.g. '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 (e.g. "}\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压缩时,将代码压缩得比任何压缩都可以压缩得多,因此将minmin和gZip结合起来是没有意义的,因为下载所节省的时间因压缩而浪费了,并且节省了最少的时间。
这是我的结果(通过3G网络下载):
Original HTML: 150kB 180ms download
gZipped HTML: 24kB 40ms
minified HTML: 120kB 150ms download + 150ms minification
min+gzip HTML: 22kB 30ms download + 150ms minification
这为我工作。
function Minify_Html($Html)
{
$Search = array(
'/(\n|^)(\x20+|\t)/',
'/(\n|^)\/\/(.*?)(\n|$)/',
'/\n/',
'/\<\!--.*?-->/',
'/(\x20+|\t)/', # Delete multispace (Without \n)
'/\>\s+\</', # strip whitespaces between tags
'/(\"|\')\s+\>/', # strip whitespaces between quotation ("') and end tags
'/=\s+(\"|\')/'); # strip whitespaces between = "'
$Replace = array(
"\n",
"\n",
" ",
"",
" ",
"><",
"$1>",
"=$1");
$Html = preg_replace($Search,$Replace,$Html);
return $Html;
}
在文档根目录之外创建一个PHP文件。如果您的文档根目录是
/var/www/html/
在其上一级创建一个名为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文件。如果它是专用的服务器/ VPS,请搜索以下选项,并使用自定义php.ini在共享主机上添加它。
auto_prepend_file = /var/www/minify.php
参考:http : //websistent.com/how-to-use-php-to-minify-html-output/
您可以查看以下一组类:https : //code.google.com/p/minify/source/browse/?name=master#git%2Fmin%2Flib%2FMinify name=master#git%2Fmin%2Flib%2FMinify,您将找到html / css / js缩小在那里上课。
您也可以尝试以下操作:http : //code.google.com/p/htmlcompressor/
祝好运 :)
您可以查看HTML TIDY- http://uk.php.net/tidy
它可以作为PHP模块安装,并且(正确,安全地)去除空格和所有其他麻烦,同时仍然输出完全有效的HTML / XHTML标记。它还会清除您的代码,这可能是一件好事,也可能会很糟糕,这取决于您在一开始编写有效代码的能力如何;-)
此外,您可以在文件开头使用以下代码gzip输出:
ob_start('ob_gzhandler');
phpinfo()
...至少zlib
应该安装允许您使用的ob_gzhandler
。
if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start();
是不是同一件事?
else ob_start()
部分,也不需要gzip check ... ob_gzhandler
检测浏览器内部是否支持任何压缩方法。仅仅拥有ob_start('ob_gzhandler');
就足够了。
首先,gzip不仅可以为HTML Minifier提供帮助,
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;
第二:使用gzip + HTML压缩,您可以大幅减少文件大小!!!
我已经为PHP创建了此HtmlMinifier。
您可以通过composer检索它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();
如您所见,您可以在此处扩展很多内容,还可以传递各种选项。检查自述文件以查看所有可用选项。
这个HtmlMinifier是完整和安全的。缩小过程需要3个步骤:
我建议您缓存视图的输出。缩小过程应该是一次性过程。或例如基于间隔进行。
当时未创建明确的基准。但是,minifier可以根据您的标记将页面大小减小5-25%!
如果要添加自己的策略,则可以使用addPlaceholder
和addMinifier
方法。
require __DIR__ . '/vendor/autoload.php';
您要做的唯一一件事就是包括该文件。这是由作曲家生成的!
我有一个GitHub要点,其中包含PHP函数以最小化HTML,CSS和JS文件→ https://gist.github.com/taufik-nurrohman/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(); ?>
感谢安德鲁。这是在cakePHP中使用它的方法:
像下面这样在cake的View / Helper中创建MinifyCodeHelper.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;
}
}
在AppController中启用了我的助手
public $ helpers = array('Html','...','MinifyCode');
5 ...瞧!
我的结论是:如果在您的服务器中禁用了apache的deflate和headers模块,则您的增益将减少21%,减少0.35s,并请求压缩(在我的情况下,此数字)。
但是,如果启用了apache的模块,则压缩响应没有明显差异(对我而言为1.3%),而压缩时间为samne(对我而言为0.3s)。
所以...我为什么要这样做?“因为我项目的文档全都在注释中(php,css和js),而我的最终用户则无需查看此内容;)
您可以使用()调用经过良好测试的Java压缩程序,例如HTMLCompressor。
记住要使用重定向控制台passthru
exec
2>&1
但是,如果考虑到速度,这可能没有用。我将其用于静态php输出
ob_start(function($b){return preg_replace(['/\>[^\S ]+/s','/[^\S ]+\</s','/(\s)+/s'],['>','<','\\1'],$b);});