Как минимизировать вывод 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

  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. Восстановить исходный контент.

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

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

  1. Скачать minify-2.1.7
  2. Распакуйте файл и скопируйте подпапку min в папку Vendor торта
  3. Создает 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;
        }
    }
    
  4. Включил мой помощник в 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="[&quot;top navigation&quot;,&quot;products menu click&quot;,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="[&quot;top navigation&quot;,&quot;products menu click&quot;,null,null,null]">Products</a></li>
Другие вопросы по тегам