Я ищу php-скрипт или класс, который может минимизировать html-вывод моей php-страницы, как это делает скорость страницы google.
Как я могу это сделать?
Я ищу php-скрипт или класс, который может минимизировать html-вывод моей php-страницы, как это делает скорость страницы google.
Как я могу это сделать?
<pre>
или, <code>
поскольку им нужны пробелы для правильной структуры. Однако <script>
обычно он должен быть внешним или встроенным, но с ;
строгим использованием, чтобы он также работал. Какие еще теги могут нарушить @Brad? Я не мог думать о других. Однако я должен был добавить быстрый и грязный путь до моего предыдущего комментария.
Ответы:
Рассмотрим следующую ссылку для минимизации файлов Javascript / CSS: https://github.com/mrclay/minify
Скажите Apache доставлять HTML с помощью GZip - это обычно уменьшает размер ответа примерно на 70%. (Если вы используете Apache, модуль настройки gzip зависит от вашей версии: Apache 1.3 использует mod_gzip, а Apache 2.x использует mod_deflate.)
Принятие кодировки: gzip, deflate
Кодирование содержимого: 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");
?>
$content = \Minify_HTML::minify($content);
вы даже можете добавить обратные вызовы в минификаторы js / css для встроенного кода). См github.com/mrclay/minify/blob/master/min/lib/Minify/HTML.php
<script>
тегах), который не находится ;
в конце каждого оператора или имеет комментарии, которые используются//
Включите gzip, если хотите, чтобы это было правильно. Вы также можете сделать что-то вроде этого:
$this->output = preg_replace(
array(
'/ {2,}/',
'/<!--.*?-->|\t|(?:\r?\n[ \t]*)+/s'
),
array(
' ',
''
),
$this->output
);
Это удаляет около 30% размера страницы, превращая ваш html в одну строку, без вкладок, без новых строк, без комментариев. Пробег может отличаться
У всех 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 ваш код сжимается намного сильнее, чем может сделать любая минификация, поэтому объединение минификации и 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 , вы найдете минификацию html / css / js классы там.
вы также можете попробовать это: http://code.google.com/p/htmlcompressor/
Удачи :)
Вы можете посмотреть HTML TIDY - http://uk.php.net/tidy
Его можно установить как модуль PHP, и он (правильно и безопасно) удалит пробелы и все прочие неприятности, в то же время выводя совершенно корректную разметку HTML / XHTML. Он также очистит ваш код, что может быть как отличным, так и ужасным, в зависимости от того, насколько вы хороши в написании правильного кода в первую очередь ;-)
Кроме того, вы можете сжать выходные данные, используя следующий код в начале вашего файла:
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 ... ob_gzhandler
определяет, поддерживает ли браузер какой-либо метод сжатия внутри. Достаточно просто иметь ob_start('ob_gzhandler');
.
Прежде всего, gzip может помочь вам больше, чем Html Minifier.
С 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;
Во-вторых: с помощью 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
методы.
require __DIR__ . '/vendor/autoload.php';
файл readme следующим правилом: единственное, что вам нужно сделать, это включить этот файл. Это создано композитором!
У меня есть GitHub gist, содержащий функции 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:
Создает MinifyCodeHelper.php в View / Helper торта следующим образом:
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% для меня), а время сжатия составляет samne (0,3 с для меня).
Итак ... зачем я это сделал? Потому что все документы моего проекта находятся в комментариях (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);});