I am looking for a php script or class that can minify my php page html output like google page speed does.
How can I do this?
I am looking for a php script or class that can minify my php page html output like google page speed does.
How can I do this?
Consider the following link to minify Javascript/CSS files: https://github.com/mrclay/minify
Tell Apache to deliver HTML with GZip - this generally reduces the response size by about 70%. (If you use Apache, the module configuring gzip depends on your version: Apache 1.3 uses mod_gzip while Apache 2.x uses mod_deflate.)
Accept-Encoding: gzip, deflate
Content-Encoding: gzip
Use the following snippet to remove white-spaces from the HTML with the help ob_start\'s buffer:
<?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\");
?>
Turn on gzip if you want to do it properly. You can also just do something like this:
$this->output = preg_replace(
array(
\'/ {2,}/\',
\'/<!--.*?-->|\\t|(?:\\r?\\n[ \\t]*)+/s\'
),
array(
\' \',
\'\'
),
$this->output
);
This removes about 30% of the page size by turning your html into one line, no tabs, no new lines, no comments. Mileage may vary
All of the preg_replace()
solutions above have issues of single line comments, conditional comments and other pitfalls. I\'d recommend taking advantage of the well-tested Minify project rather than creating your own regex from scratch.
In my case I place the following code at the top of a PHP page to minify it:
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\');
I\'ve tried several minifiers and they either remove too little or too much.
This code removes redundant empty spaces and optional HTML (ending) tags. Also it plays it safe and does not remove anything that could potentially break HTML, JS or CSS.
Also the code shows how to do that in 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);
}
}
But note that when using gZip compression your code gets compressed a lot more that any minification can do so combining minification and gZip is pointless, because time saved by downloading is lost by minification and also saves minimum.
Here are my results (download via 3G network):
Original HTML: 150kB 180ms download
gZipped HTML: 24kB 40ms
minified HTML: 120kB 150ms download + 150ms minification
min+gzip HTML: 22kB 30ms download + 150ms minification
you can check out this set of classes: https://code.google.com/p/minify/source/browse/?name=master#git%2Fmin%2Flib%2FMinify , you\'ll find html/css/js minification classes there.
you can also try this: http://code.google.com/p/htmlcompressor/
Good luck :)
Create a PHP file outside your document root. If your document root is
/var/www/html/
create the a file named minify.php one level above it
/var/www/minify.php
Copy paste the following PHP code into it
<?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\");?>
Save the minify.php file and open the php.ini file. If it is a dedicated server/VPS search for the following option, on shared hosting with custom php.ini add it.
auto_prepend_file = /var/www/minify.php
Reference: http://websistent.com/how-to-use-php-to-minify-html-output/
This work for me.
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;
}
You can look into HTML TIDY - http://uk.php.net/tidy
It can be installed as a PHP module and will (correctly, safely) strip whitespace and all other nastiness, whilst still outputting perfectly valid HTML / XHTML markup. It will also clean your code, which can be a great thing or a terrible thing, depending on how good you are at writing valid code in the first place ;-)
Additionally, you can gzip the output using the following code at the start of your file:
ob_start(\'ob_gzhandler\');
First of all gzip can help you more than a Html Minifier
With 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;
Second: with gzip + Html Minification you can reduce the file size drastically!!!
I\'ve created this HtmlMinifier for PHP.
You can retrieve it through composer: composer require arjanschouten/htmlminifier dev-master
.
There is a Laravel service provider. If you\'re not using Laravel you can use it from 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();
As you can see you can extend a lot of things in here and you can pass various options. Check the readme to see all the available options.
This HtmlMinifier is complete and safe. It takes 3 steps for the minification process:
I would suggest that you cache the output of you\'re views. The minification process should be a one time process. Or do it for example interval based.
Clear benchmarks are not created at the time. However the minifier can reduce the page size with 5-25% based on the your markup!
If you want to add you\'re own strategies you can use the addPlaceholder
and the addMinifier
methods.
I have a GitHub gist contains PHP functions to minify HTML, CSS and JS files → https://gist.github.com/tovic/d7b310dea3b33e4732c0
Here’s how to minify the HTML output on the fly with output buffer:
<?php
include \'path/to/php-html-css-js-minifier.php\';
ob_start(\'minify_html\');
?>
<!-- HTML code goes here ... -->
<?php echo ob_get_clean(); ?>
If you want to remove all new lines in the page, use this fast code:
ob_start(function($b){
if(strpos($b, \"<html\")!==false) {
return str_replace(PHP_EOL,\"\",$b);
} else {return $b;}
});
Thanks to Andrew. Here\'s what a did to use this in cakePHP:
Creates MinifyCodeHelper.php in cake\'s View/Helper like this:
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;
}
}
Enabled my Helper in AppController
public $helpers = array (\'Html\',\'...\',\'MinifyCode\');
5... Voila!
My conclusion: If apache\'s deflate and headers modules is disabled in your server your gain is 21% less size and 0.35s plus in request to compress (this numbers was in my case).
But if you had enable apache\'s modules the compressed response has no significant difference (1.3% to me) and the time to compress is the samne (0.3s to me).
So... why did I do that? \'couse my project\'s doc is all in comments (php, css and js) and my final user dont need to see this ;)
You can use a well tested Java minifier like HTMLCompressor by invoking it using passthru
(exec
).
Remember to redirect console using 2>&1
This however may not be useful, if speed is a concern. I use it for static php output