Как минимизировать вывод hpml страницы php?
Я ищу сценарий php или класс, который может уменьшить вывод hpml моей страницы php, как это делает скорость страницы Google.
Как я могу это сделать?
15 ответов
CSS и Javascript
Рассмотрите следующую ссылку для минимизации файлов Javascript/CSS: https://github.com/mrclay/minify
HTML
Скажите Apache, чтобы он доставлял HTML с помощью GZip - это обычно уменьшает размер ответа примерно на 70%. (Если вы используете Apache, модуль, конфигурирующий gzip, зависит от вашей версии: Apache 1.3 использует mod_gzip, а Apache 2.x использует mod_deflate.)
Accept-Encoding: gzip, выкачать
Контент-кодировка: gzip
Используйте следующий фрагмент для удаления пробелов из HTML с помощью буфера ob_start:
<?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");
?>
Это работа для меня.
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;
}
Включите gzip, если вы хотите сделать это правильно. Вы также можете просто сделать что-то вроде этого:
$this->output = preg_replace(
array(
'/ {2,}/',
'/<!--.*?-->|\t|(?:\r?\n[ \t]*)+/s'
),
array(
' ',
''
),
$this->output
);
Это удаляет около 30% размера страницы, превращая ваш HTML в одну строку, без вкладок, без новых строк, без комментариев. Пробег может отличаться
Я пробовал несколько минифайеров, и они удаляют слишком мало или слишком много.
Этот код удаляет лишние пробелы и необязательные 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 ваш код сжимается намного сильнее, чем любая минификация, так что комбинирование минификации и 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
Все 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');
Создайте файл 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, вы найдете миниатюру html/css/js занятия там.
Вы также можете попробовать это: http://code.google.com/p/htmlcompressor/
Удачи:)
Вы можете посмотреть в HTML TIDY - http://uk.php.net/tidy
Он может быть установлен как модуль PHP и будет (правильно, безопасно) удалять пробелы и все другие неприятности, в то же время выводя совершенно корректную разметку HTML / XHTML. Это также очистит ваш код, который может быть как хорошим, так и ужасным, в зависимости от того, насколько вы хороши в написании корректного кода в первую очередь;-)
Кроме того, вы можете сжать вывод, используя следующий код в начале вашего файла:
ob_start('ob_gzhandler');
Если вы хотите удалить все новые строки на странице, используйте этот быстрый код:
ob_start(function($b){
if(strpos($b, "<html")!==false) {
return str_replace(PHP_EOL,"",$b);
} else {return $b;}
});
Прежде всего, 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;
- С Apache вы можете использовать mod_gzip
Второе: с помощью gzip + Html Minification вы можете резко уменьшить размер файла!!!
Я создал этот HtmlMinifier для 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();
Как вы можете видеть, вы можете расширить здесь многое, и вы можете передать различные варианты. Проверьте файл readme, чтобы увидеть все доступные варианты.
Этот HtmlMinifier является полным и безопасным. Требуется 3 шага для процесса минификации:
- Замените критический контент временным заполнителем.
- Запустите стратегии минификации.
- Восстановить исходный контент.
Я бы посоветовал вам кешировать вывод ваших просмотров. Процесс минификации должен быть однократным. Или сделать это, например, на основе интервала.
Четкие ориентиры не создаются в то время. Однако минимизатор может уменьшить размер страницы на 5-25% в зависимости от вашей разметки!
Если вы хотите добавить свои собственные стратегии, вы можете использовать addPlaceholder
и addMinifier
методы.
У меня есть 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(); ?>
Эта работа для меня на php apache wordpress + w total cache + amp поместила его в верхнюю часть php-страницы
<?Php
if(substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')){
ob_start ('ob_html_compress');
}else{
ob_start();
}
function ob_html_compress($buf) {
$search = array('/\>[^\S ]+/s', '/[^\S ]+\</s', '/(\s)+/s', '/<!--(.|\s)*?-->/');
$replace = array('>', '<', '\\1', '');
$buf = preg_replace($search, $replace, $buf);
return $buf;
return str_replace(array("\n","\r","\t"),'',$buf);
}
?>
затем остальная часть вашего php или html материала
Спасибо Andrew. Вот что сделал, чтобы использовать это в cakePHP:
- Скачать minify-2.1.7
- Распакуйте файл и скопируйте подпапку min в папку Vendor торта
Создает 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.35 с плюс в запросе на сжатие (это число было в моем случае).
Но если бы вы включили модули Apache, сжатый ответ не имеет существенной разницы (для меня 1,3%), и время для сжатия - то же самое (для меня 0,3 с).
Итак... почему я это сделал? все документы моего проекта в комментариях (php, css и js), и мой конечный пользователь не должен видеть это;)
Вы можете использовать хорошо протестированный Java minifier, такой как HTMLCompressor, вызвав его, используя passthru
(exec
).
Не забудьте перенаправить консоль используя 2>&1
Это, однако, может быть бесполезным, если скорость является проблемой. Я использую его для статического вывода php
Самый простой способ - использовать strtr и удалить пробелы. При этом не используйте javascript, так как это может сломать ваш код.
$html_minify = fn($html) => strtr($html, [PHP_EOL => '', "\t" => '', ' ' => '', '< ' => '<', '> ' => '>']);
echo $html_minify(<<<HTML
<li class="flex--item">
<a href="#"
class="-marketing-link js-gps-track js-products-menu"
aria-controls="products-popover"
data-controller="s-popover"
data-action="s-popover#toggle"
data-s-popover-placement="bottom"
data-s-popover-toggle-class="is-selected"
data-gps-track="top_nav.products.click({location:2, destination:1})"
data-ga="["top navigation","products menu click",null,null,null]">
Products
</a>
</li>
HTML);
// Response (echo): <li class="flex--item"><a href="#"class="-marketing-link js-gps-track js-products-menu"aria-controls="products-popover"data-controller="s-popover"data-action="s-popover#toggle"data-s-popover-placement="bottom"data-s-popover-toggle-class="is-selected"data-gps-track="top_nav.products.click({location:2, destination:1})"data-ga="["top navigation","products menu click",null,null,null]">Products</a></li>