Php sayfası html çıktısını küçültmek nasıl?


143

Google sayfa hızı gibi benim php sayfa html çıktı minimize edebilir bir php komut dosyası veya sınıf arıyorum.

Bunu nasıl yapabilirim?


14
@RakeshS cevabına dayanan tek astar:ob_start(function($b){return preg_replace(['/\>[^\S ]+/s','/[^\S ]+\</s','/(\s)+/s'],['>','<','\\1'],$b);});
Francisco

5
@FranciscoPresencia Bunu yapmak gerçekten kötü bir şey. Komut dosyası etiketlerini, ön etiketleri vb.
Brad

Bu, cevap yorumlarında belirtildiği gibi, düzgün yapı için boşluk alanına ihtiyaç duydukları için çalışmaz <pre>veya <code>etiketlerle çalışmaz . Bununla birlikte, <script>normalde harici veya satır içi olmalıdır, ancak ;sıkı bir şekilde kullanıldığından da çalışır. Başka hangi etiketler @Brad kırdı? Başkalarını düşünemedim. Benim önceki yorum olsa önce hızlı ve kirli bir şekilde eklemeliydim .
Francisco Presencia

Yanıtlar:


213

CSS ve Javascript

Javascript / CSS dosyalarını küçültmek için aşağıdaki bağlantıyı göz önünde bulundurun: https://github.com/mrclay/minify

HTML

Apache'ye HTML'yi GZip ile teslim etmesini söyleyin - bu genellikle yanıt boyutunu yaklaşık% 70 oranında azaltır. (Apache kullanıyorsanız, gzip'i yapılandıran modül sürümünüze bağlıdır: Apache 1.3 mod_gzip kullanırken Apache 2.x mod_deflate kullanır.)

Kabul Et-Kodlama: gzip, deflate

İçerik Kodlaması: gzip

HTML'den beyaz boşlukları yardım ob_start arabelleği ile kaldırmak için aşağıdaki snippet'i kullanın :

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

?>

54
Bu iyi bir işlevdir, ancak PRE etiketleri kullanıyorsanız dikkatli olun , bazen orada yeni satırlar kaldırılır.
fedmich

2
Bu kod betiğinizin üstünde veya altında nerede olmalıdır?
jdepypere

8
Minify_HTML sınıfını bu Minify kütüphanesinden de kullanabilirsiniz ( $content = \Minify_HTML::minify($content);hatta satır içi kod için js / css minifier'larına geri çağrılar da ekleyebilirsiniz). Bkz. Github.com/mrclay/minify/blob/master/min/lib/Minify/HTML.php
Barryvdh

21
Bu ayrıca , her ifadenin sonunda <script>olmayan ;veya kullanan yorumları olan satır içi JavaScript'i (yani etiketlerde) kırar//
Konstantin Pereiaslov

8
bu, textarea, pre, input, img alanlarını kaldıracak ve bu da satır içi javascripts'i kıracaktır. Birisi regexp dayalı bu çözüm ayrıştırma DOM ile hantal sınıf kullanmak için mutlu değilse harika çalışıyor
Peter

28

Düzgün yapmak istiyorsanız gzip'i açın. Ayrıca böyle bir şey de yapabilirsiniz:

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

Bu, html'nizi tek bir satıra dönüştürerek, sekme yok, yeni satır yok, yorum yokken sayfa boyutunun yaklaşık% 30'unu kaldırır. Kilometre değişebilir


1
Her ikisini de yapmak, gerekli olan bayt miktarını daha da azaltacaktır.
Nauta

1
aslında her ikisini de yapmak gzip yapmakla aynıdır, 700kb'lik bir sayfada gzip onu yaklaşık 400kb'ye indirir ve preg_replace () yaklaşık 450kb (hepsi içeriğe bağlı olarak) her ikisi de 399kb gibi olacaktır. sıkıştırır
dogmatic69

18
Bu, potansiyel olarak tehlikeli olabilir, çünkü IE koşullarını da kaldıracaktır ... - /<!--(?![if).*?-->/
Katai

3
Çalışmıyor, çok fazla çıkarıyor, kodu bozuyor. W3C geçerli olmadan önce ve sonra değil.
Codebeat

3
Ne yazık ki, Google Haritalar'ın daha karmaşık uygulamalarını oluşturmak için olduğu gibi Javascript kodunu da kırıyor - ki tam olarak böyle bir işleve ihtiyacım var.
richey

19

preg_replace()Yukarıdaki tüm çözümlerin tek satırlık yorumlar, koşullu yorumlar ve diğer tuzaklar vardır. Sıfırdan kendi regex'inizi oluşturmak yerine iyi test edilmiş Minify projesinden yararlanmanızı tavsiye ederim .

Benim durumumda küçültmek için bir PHP sayfasının üstüne aşağıdaki kodu yerleştirin:

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');

1
Kodunuz html'yi tek bir satıra
koymaz

Projeyi küçült SSS bölümündeki ilk soruyu okuyun . TL; DR: Yok sayın.
Andrew

Denedim, işe yaramıyor. Ben php dosyamda, <style> etiketleri ve <script> etiketleri arasında php ile gömülü javascript arasında css var
João Pimentel Ferreira

bu kodu nereye yerleştiriyorsun altbilgi veya üstbilgide son?
Francesco

@francesco Bu, sayfanızdaki ilk kod parçası olmalıdır.
Andrew

19

Birkaç minifiers denedim ve ya çok az ya da çok fazla kaldırırlar.

Bu kod, gereksiz boş alanları ve isteğe bağlı HTML (bitiş) etiketlerini kaldırır. Ayrıca güvenli bir şekilde oynatır ve HTML, JS veya CSS'yi bozabilecek hiçbir şeyi kaldırmaz.

Ayrıca kod Zend Framework'te nasıl yapılacağını gösterir:

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);
  }
}

Ancak, gZip sıkıştırması kullanırken, kodunuzun çok daha fazla sıkıştırılacağını unutmayın, böylece minyatür ve gZip'i birleştirmek anlamsızdır, çünkü indirerek kazanılan zaman minimizasyon tarafından kaybedilir ve minimum tasarruf sağlar.

İşte sonuçlarım (3G ağı üzerinden indir):

 Original HTML:        150kB       180ms download
 gZipped HTML:          24kB        40ms
 minified HTML:        120kB       150ms download + 150ms minification
 min+gzip HTML:         22kB        30ms download + 150ms minification

4
Evet, görünüşte anlamsız olduğunu kabul ediyorum, ancak google sıralamanızla alakalı olan google için sayfa hızında bir veya iki değerli puan kazanabilir. Kodunuz gereksiz alanların soyulması için mükemmeldir. Teşekkürler :-)
Tschallacka

1
Bu harika çalışıyor, = "/" ile ilgili sorunlar yaşadım, bu yüzden '~ ([\ r \ n \ t]) /' ı çıkardım? ([a-zA-Z0-9] +) = "([a-zA -Z0-9 _ / \\ -] +) "([\ r \ n \ t])? ~ S '=>' $ 1 $ 2 = $ 3 $ 4 ', // $ 1 ve 4 $ önce bulunan ilk boşluk karakteri ekle / özellikten sonra
asked_io

Olduğu gibi, sadece işleri hızlandırmak için boşlukları kaldırmak istemiyorum, çünkü satır içi blok öğeleri gibi tamamen yorulmaması için HTML'nin böyle olması gerekiyor, ama aynı zamanda yetenekli bir tane arıyorum öncesinde veya sonrasında bir boşluk olması gereken şeyleri görmezden gelme (örneğin, metin bloğundaki kalın öğeler).
Deji

Aşağıdaki satırları yorum sürece sürece bazı Jquery / Vakfı şeyler ile ilgili bir sorun buldum: // sadece JS blok son karakteri içeren "boş" satırları kaldırmak; sonraki satıra katıl (ör. "} \ n} \ n </script>" -> "}} </script>" // '/} [\ r \ n \ t] + / s' => '} ', //' /} [\ r \ n \ t] +, [\ r \ n \ t] + / s '=>'}, ',
Ian

1
Sunucu tarafı önbellekleme kullanıyorsanız (benim için Smarty V3) min + gzip, ilk çağrıda istisna olan iyi bir çözümdür. Yani, 15. aramadan sonra sunucu süresi için intersting olacak. kural = 40x15 = (30x15 + 150) Ancak ikinci çağrı için ziyaretçi için zaten daha hızlı olacak.
Meloman

6

Bu iş benim için.

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;
}

5

Belge kökünüzün dışında bir PHP dosyası oluşturun. Belge kökünüz

/var/www/html/

üstünde bir düzey minify.php adlı bir dosya oluşturun

/var/www/minify.php

Aşağıdaki PHP kodunu kopyalayın

<?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 dosyasını kaydedin ve php.ini dosyasını açın. Adanmış bir sunucu / VPS arama aşağıdaki seçenek için ise, özel php.ini ile paylaşılan barındırma ekleyin.

auto_prepend_file = /var/www/minify.php

Referans: http://websistent.com/how-to-use-php-to-minify-html-output/



2

HTML TIDY'yi inceleyebilirsiniz - http://uk.php.net/tidy

Bir PHP modülü olarak kurulabilir ve (doğru, güvenli bir şekilde) beyaz alanı ve diğer tüm nastiness'leri soyup mükemmel geçerli HTML / XHTML işaretlemesini çıkarır. Ayrıca, geçerli kod yazarken ne kadar iyi olduğunuza bağlı olarak, harika bir şey veya korkunç bir şey olabilecek kodunuzu temizleyecektir ;-)

Ayrıca, dosyanızın başlangıcında aşağıdaki kodu kullanarak çıktıyı gzip edebilirsiniz:

ob_start('ob_gzhandler');

sorun site paylaşılan üzerinde barındırılacak ve ben bu tür modülleri yüklemek için erişim olacak.
m3tsys

Şansı zaten yüklü olacak. Kontrol phpinfo()... En azından zlibyüklü olmalıdır Kullanmak için izin ob_gzhandler.
Rudi Visser

zaten kullanıyorum if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start();aynı şey değil mi?
m3tsys

2
Evet, gerçekten else ob_start()parçaya ihtiyacınız yok , ne de gzip kontrolü ... ob_gzhandlertarayıcının dahili olarak herhangi bir sıkıştırma yöntemini destekleyip desteklemediğini algılıyor. Sadece sahip olmak ob_start('ob_gzhandler');yeterli olacaktır.
Rudi Visser

Ek ayrıştırma yükü nedeniyle TIDY'nin diğer yanıtlardan daha yavaş olma ihtimali var mı? Geliştirme için iyi olabilir - o zaman gerçek kaynak kodundaki bu HTML hatalarını düzeltebilirsiniz - ancak bunun üretim için en iyi seçim olup olmadığını soruyorum.
Matt Browne

2

Her şeyden önce gzip size bir Html Minifier'tan daha fazla yardımcı olabilir

  1. Nginx ile :

    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 ile mod_gzip kullanabilirsiniz

İkincisi: gzip + Html Minification ile dosya boyutunu önemli ölçüde azaltabilirsiniz !!!

PHP için bu HtmlMinifier oluşturduk .

Sen besteci yoluyla alabilmesi: composer require arjanschouten/htmlminifier dev-master.

Bir Laravel servis sağlayıcısı var. Laravel kullanmıyorsanız PHP'den kullanabilirsiniz.

// 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();

Gördüğünüz gibi burada birçok şeyi genişletebilir ve çeşitli seçenekleri geçebilirsiniz. Mevcut tüm seçenekleri görmek için benioku dosyasına bakın.

Bu HtmlMinifier tam ve güvenlidir. Küçültme işlemi için 3 adım gerekir:

  1. Kritik içeriği geçici olarak yer tutucu ile değiştirin.
  2. Küçültme stratejilerini çalıştırın.
  3. Orijinal içeriği geri yükleyin.

Görüntülemelerinizin çıktısını önbelleğe almanızı öneririm. Küçültme süreci bir defalık bir süreç olmalıdır. Veya örneğin aralık tabanlı yapın.

O anda net ölçütler oluşturulmaz. Ancak küçültücü, işaretlemenize bağlı olarak sayfa boyutunu% 5-25 azaltabilir!

Eğer kendi stratejilerinizi eklemek istiyorsanız addPlaceholderve addMinifieryöntemlerini kullanabilirsiniz.


Kütüphane için teşekkürler. Talimatlar hangi PHP dosyalarını eklemem gerektiğini söylemiyor. Sonunda anlayacağım, ama bu muhtemelen web sitenize eklemeniz gereken bir şey.
rosewater

Hala Illuminate \ Support \ Collection gerektiriyor gibi görünüyor. Bu tek başına bir PHP çözümü değil.
rosewater

Geri dönüşünüz için teşekkür ederiz! Bir besteci paketidir. Beniokurequire __DIR__ . '/vendor/autoload.php'; dosyasını aşağıdaki kuralla güncelledim : Yapmanız gereken tek şey bu dosyayı dahil etmek. Bu besteci tarafından oluşturulur!
ArjanSchouten


1

Sayfadaki tüm yeni satırları kaldırmak istiyorsanız, şu hızlı kodu kullanın:

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

0

Andrew'a teşekkürler . İşte bunu cakePHP'de kullanmak için ne yaptı:

  1. Minify-2.1.7 sürümünü indirin
  2. Dosyayı açın ve min alt klasörünü cake'in Satıcı klasörüne kopyalayın
  3. Cake'in View / Helper uygulamasında MinifyCodeHelper.php dosyasını şöyle oluşturur:

    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'da Yardımcımı etkinleştirdim

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

5 ... Voila!

Sonuç: Apache'nin deflate ve headers modülleri sunucunuzda devre dışı bırakılmışsa, kazancınız% 21 daha az boyut ve sıkıştırma talebinde 0.35s artıdır (bu sayılar benim durumumda).

Ancak apache'nin modüllerini etkinleştirdiyseniz, sıkıştırılmış yanıtın önemli bir farkı yoktur (benim için% 1.3) ve sıkıştırma süresi samne'dir (benim için 0.3s).

Peki ... neden bunu yaptım? çünkü projemin dokümanı yorumlarda (php, css ve js) ve son kullanıcımın bunu görmesine gerek yok;)


0

HTMLCompressor gibi iyi test edilmiş bir Java minifier'ı passthru( exec) kullanarak çağırabilirsiniz .
Konsolu kullanarak yeniden yönlendirmeyi unutmayın2>&1

Bununla birlikte, hız bir endişe kaynağı ise bu yararlı olmayabilir. Statik php çıktısı için kullanıyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.