Как минимизировать вывод php page html?

Я ищу php-скрипт или класс, который может минимизировать вывод html-страницы php-страницы, например, скорость страницы Google.

Как я могу это сделать?

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, 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"); ?> 

Включите gzip, если вы хотите сделать это правильно. Вы также можете просто сделать что-то вроде этого:

 $this->output = preg_replace( array( '/ {2,}/', '/<!--.*?-->|\t|(?:\r?\n[ \t]*)+/s' ), array( ' ', '' ), $this->output ); 

Это удаляет около 30% размера страницы, превращая ваш html в одну строку, без вкладок, без новых строк, без комментариев. Пробег может варьироваться

Все preg_replace() решения 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 (eg '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 (eg "}\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 

Это может быть достигнуто с помощью 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

  1. С 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; 
  2. С помощью 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 шага:

  1. Заменяйте критический контент временно с помощью заполнителя.
  2. Запустите стратегии минимизации.
  3. Восстановите исходное содержимое.

Я бы посоветовал вам кэшировать вывод ваших представлений. Процесс минимизации должен быть одноразовым процессом. Или сделать это, например, на основе интервалов.

Четкие контрольные показатели не создаются в то время. Однако minifier может уменьшить размер страницы на 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(); ?> 

Если вы хотите удалить все новые строки на странице, используйте этот быстрый код:

 ob_start(function($b){ if(strpos($b, "<html")!==false) { return str_replace(PHP_EOL,"",$b); } else {return $b;} }); 

Спасибо Эндрю . Вот что сделал, чтобы использовать это в cakePHP:

  1. Загрузить minify-2.1.7
  2. Распакуйте файл и скопируйте вложенную папку в папку Vendor cake
  3. Создает файл MinifyCodeHelper.php в представлении / помощнике cake:

     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; } } 
  4. Включен мой помощник в AppController

    public $ helpers = array ('Html', '…', 'MinifyCode');

5 … Вуаля!

Мой вывод: если на вашем сервере отключены модули дефляции и заголовков Apache, ваш выигрыш на 21% меньше размера и 0,35 с плюс в запросе на сжатие (эти цифры были в моем случае).

Но если вы включили модули apache, сжатый отклик не имеет существенной разницы (1,3% для меня), а время для сжатия – это samne (0,3 с меня).

Итак … почему я это сделал? 'couse мой проект doc все в комментариях (php, css и js), и мой конечный пользователь не должен это видеть;)

Вы можете использовать хорошо проверенный Java- минидрактор, например, HTMLCompressor , вызывая его с помощью passthru ( exec ).
Не забудьте перенаправить консоль, используя 2>&1

Однако это может быть полезно, если скорость вызывает беспокойство. Я использую его для статического php-вывода