2009-08-09 15 views
8

Si potrebbe sapere che i formati di file relativi a HTML sono compressi usando la compressione GZip, lato server, (da mod_gzip su server Apache) e sono decompressi dai browser compatibili. ("codifica del contenuto")Come funziona GZipping lato server?

Funziona solo per file HTML/XML? Diciamo che il mio file PHP/Perl genera dei semplici dati delimitati da virgole e che lo inviano al browser, sarà codificato di default?

Che dire di piattaforme come Silverlight o Flash, quando scaricano tali dati saranno compressi/decompressi automaticamente dal browser/runtime? C'è un modo per testarlo?

risposta

9

Funziona solo per i file HTML/XML ?

No: è molto spesso utilizzato per i file CSS e JS, per esempio - quelli sono tra la cosa più grande che i siti web sono realizzati (eccetto le immagini), a causa del framework JS e le applicazioni full-JS, rappresenta un enorme guadagno!

In realtà, qualsiasi formato basato su testo può essere compresso piuttosto bene (al contrario, le immagini non possono, ad esempio, poiché sono generalmente già compresse); a volte, i dati JSON restituiti da Ajax-richieste sono compressi troppo - è dati di testo, dopotutto ;-)

consente di dire il mio file/Perl PHP genera alcuni semplici dati delimitati da virgole, e invia che al browser , sarà codificato di default?

È una questione di configurazione: se è stato configurato il server per comprimere questo tipo di contenuti, sarà probabilmente essere compresso :-)
(Se il browser dice che accetta dati gzip-encoded)


Ecco un esempio di configurazione per Apache 2 (utilizzando mod_deflate) che uso sul mio blog:

<IfModule mod_deflate.c> 
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/xml 
</IfModule> 

Qui, voglio HTML/XML/CSS/JS essere compresso.

E qui è la stessa cosa, più/meno un paio di opzioni di configurazione che ho usato una volta, sotto Apache 1 (mod_gzip):

<IfModule mod_gzip.c> 
    mod_gzip_on     Yes 
    mod_gzip_can_negotiate  Yes 

    mod_gzip_minimum_file_size 256 
    mod_gzip_maximum_file_size 500000 

    mod_gzip_dechunk    Yes 

    mod_gzip_item_include   file  \.css$ 
    mod_gzip_item_include   file  \.html$ 
    mod_gzip_item_include   file  \.txt$ 
    mod_gzip_item_include   file  \.js$ 
    mod_gzip_item_include   mime  text/html 

    mod_gzip_item_exclude   mime  ^image/ 
</IfModule> 

cose che possono essere notati qui sono che io non voglio troppo piccolo (il guadagno non sarebbe abbastanza importante) o troppo grande (mangerebbe troppo CPU per comprimere) i file da comprimere; e voglio che i file css/html/txt/js siano compressi, ma non le immagini.


Se si desidera che i dati separati da virgole essere compresso allo stesso modo, si dovrà aggiungere o si tratta di tipo di contenuto o è un'estensione per la configurazione del server web, per attivare gzip compressione per esso.

C'è un modo per testare questo?

per qualsiasi contenuto restituito direttamente al browser, le estensioni di Firefox Firebug o LiveHTTPHeaders sono un must-have.

Per il contenuto che non passa attraverso il modo standard di comunicazione del browser, potrebbe essere più difficile; alla fine, potrebbe essere necessario utilizzare qualcosa come Wireshark per "annusare" ciò che sta veramente attraversando i tubi ... Buona fortuna!

Che dire di piattaforme come Silverlight o Flash, quando scaricano tali dati saranno oggetto compresso/decompresso dal browser/runtime automaticamente?

Per rispondere alla domanda su Silverlight e Flash, se inviano un'intestazione Accept che indica che supportano il contenuto compresso, Apache utilizzerà mod_deflate o mod_gzip. Se non supportano la compressione, non invieranno l'intestazione. "Funzionerà". - Nate

+6

solo per chiarire per i lettori futuri: Qualsiasi tipo di HTTP i dati possono essere compressi, punto. È solo una cattiva idea per i dati che sono già compressi, come le immagini. –

+0

@Sean> esattamente; Mi chiedo se si possa ottenere qualcosa ricomprimendo le immagini, btw ... Mai osato provarlo ^^ (immagino che il guadagno sarebbe davvero minimalista, se non nullo, e mangerebbe un po 'di CPU per quasi nulla ...) –

+0

Bene, ho visto immagini BMP non compresse servite ... –

5

Penso che Apache's mod_deflate sia più comune di mod_gzip, perché è incorporato e fa la stessa cosa. Guarda la documentazione di mod_deflate (linkata sopra) e vedrai che è facile specificare quali tipi di file comprimere, in base ai loro tipi MIME. Generalmente vale la pena comprimere HTML, CSS, XML e JavaScript. Le immagini sono già compresse, quindi non beneficiano della compressione.

4

Il browser invia un'intestazione "Accetta-Codifica" con i tipi di compressione che sa come capire. Il server guarda questo, insieme all'agente utente e decide come codificare il risultato. Alcuni browser mentono su ciò che possono capire, quindi questo è più complesso della semplice ricerca di "deflate" nell'intestazione.

Tecnicamente, qualsiasi risposta HTTP/2xx con contenuto può essere codificata dal contenuto utilizzando una qualsiasi codifica del contenuto valida (gzip, zlib, deflate, ecc.), Ma in pratica è inutile applicare la compressione ai tipi di immagine comuni perché li rende effettivamente più grandi.

È possibile comprimere la risposta da pagine PHP dinamiche. Il metodo più semplice è aggiungere:

<?php ob_start("ob_gzhandler"); ?> 

all'inizio di ogni pagina PHP. È meglio configurarlo tramite la configurazione di PHP, ovviamente.

Ci sono molte pagine di prova, facilmente reperibili con Google: