Я ищу php script или класс, который может минимизировать мой вывод html-страницы php, например, скорость страницы Google.
Как я могу это сделать?
Я ищу php script или класс, который может минимизировать мой вывод html-страницы php, например, скорость страницы Google.
Как я могу это сделать?
Рассмотрим следующую ссылку для минимизации файлов Javascript/CSS: https://github.com/mrclay/minify
Скажите Apache, чтобы доставить HTML с GZip - это обычно уменьшает размер ответа примерно на 70%. (Если вы используете Apache, модуль, настраивающий gzip, зависит от вашей версии: Apache 1.3 использует mod_gzip, а Apache 2.x использует mod_deflate.)
Accept-Encoding: gzip, deflate
Content-Encoding: 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");
?>
Включите 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');
Я пробовал несколько minifiers, и они либо удалили слишком мало, либо слишком много.
Этот код удаляет избыточные пустые пространства и необязательные теги 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 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 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 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 ваш код сжимается намного больше, чем любой мини-код может сделать это, сочетая minification и 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
Это может быть легко достигнуто с помощью PHPWee - бесплатной библиотеки с открытым исходным кодом php 5.
Код:
function sanitize_output($buffer) {
require_once ("phpwee-php-minifier/phpwee.php");
return PHPWee\Minify::html($buffer);
}
ob_start('sanitize_output');
Примечания
вы можете проверить этот набор классов: https://code.google.com/p/minify/source/browse/?name=master#git%2Fmin%2Flib%2FMinify, вы найдете там классы html/css/js minification.
вы также можете попробовать следующее: http://code.google.com/p/htmlcompressor/
Удачи:)
Создайте файл 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/
Вы можете посмотреть в HTML TIDY - http://uk.php.net/tidy
Он может быть установлен как PHP-модуль и будет (правильно, безопасно) разбивать пробелы и всю другую гадость, в то же время выдавая совершенно правильную разметку HTML/XHTML. Он также очистит ваш код, что может быть отличным вещью или ужасной вещью, в зависимости от того, насколько вы хороши при написании действительного кода в первую очередь; -)
Кроме того, вы можете gzip вывод, используя следующий код в начале вашего файла:
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 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 шага:
Я бы посоветовал вам кэшировать вывод ваших представлений. Процесс минимизации должен быть одноразовым процессом. Или сделать это, например, на основе интервала.
В то время не создаются четкие контрольные показатели. Однако minifier может уменьшить размер страницы на 5-25% в зависимости от вашей разметки!
Если вы хотите добавить свои собственные стратегии, вы можете использовать addPlaceholder
и addMinifier
.
У меня есть GitHub gist содержит функции PHP для минимизации HTML, CSS и JS файлов и rarr; 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;}
});
Благодаря Andrew. Вот что он сделал, чтобы использовать это в cakePHP:
Создает MinifyCodeHelper.php в cake 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 и модули заголовков отключены на вашем сервере, ваш выигрыш на 21% меньше размера и 0,35 с плюс в запросе на сжатие (эти цифры были в моем случае).
Но если вы включили модули apache, сжатый отклик не имеет существенной разницы (1,3% для меня), а время для сжатия - это samne (0,3 с меня).
Итак... почему я это сделал? 'couse мой проект doc все в комментариях (php, css и js), и мой конечный пользователь не должен это видеть;)
Вы можете использовать хорошо протестированную Java minifier как HTMLCompressor, вызвав ее с помощью passthru
(exec
). < ш > Не забудьте перенаправить консоль, используя 2>&1
Однако это может быть не полезно, если скорость вызывает беспокойство. Я использую его для статического php-вывода