2009-12-07 25 views
24

La maggior parte dei siti desidera comprimere i propri contenuti per risparmiare sulla larghezza di banda. Tuttavia, quando si tratta di server Apache che eseguono PHP ci sono due modi per farlo - with PHP o con apache. Quindi quale è più veloce o più facile sul tuo server?Comprimere il contenuto con PHP ob_start() vs Apache Deflate/Gzip?

Per esempio, in PHP corro la seguente funzione alla partenza delle mie pagine per abilitarlo:

/** 
* Gzip compress page output 
* Original function came from wordpress.org 
*/ 
function gzip_compression() { 

    //If no encoding was given - then it must not be able to accept gzip pages 
    if(empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { return false; } 

    //If zlib is not ALREADY compressing the page - and ob_gzhandler is set 
    if ((ini_get('zlib.output_compression') == 'On' 
     OR ini_get('zlib.output_compression_level') > 0) 
     OR ini_get('output_handler') == 'ob_gzhandler') { 
     return false; 
    } 

    //Else if zlib is loaded start the compression. 
    if (extension_loaded('zlib') AND (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)) { 
     ob_start('ob_gzhandler'); 
    } 

} 

Il other option è quello di utilizzare Apache deflate or gzip (sia quelle che sono very close). Per abilitarli puoi aggiungere qualcosa come questo al tuo file .htaccess.

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php 

Poiché PHP è un linguaggio di script (che deve essere caricato da PHP) Supporrei che il metodo apache sarebbe 1) più stabile e 2) più veloce. Ma le ipotesi non hanno molto senso nel mondo reale.

Dopotutto, si suppone che con le enormi finestre di supporto finanziario sia ... uh, non ci andremo.

risposta

14

Stiamo eseguendo ... molti server Web, gestendo 60 milioni di euro/unici al giorno. Normalmente non vale la pena menzionarlo, ma la tua domanda sembra basata sull'esperienza.

Corriamo con il farlo in apache. Quello che esce dall'altra parte è lo stesso (o abbastanza vicino da non avere importanza) indipendentemente dal metodo scelto.

Noi scegliamo apache per alcuni motivi:

  • Zero manutenzione, abbiamo appena accese. Nessuno ha bisogno di mantenere la struttura delle case
  • Prestazioni, nei nostri server di test in cui Apache ha fatto il lavoro leggermente migliore.
  • Apache applicherà il filtro di output a tutto, al contrario di solo PHP. In alcune occasioni ci sono altri tipi di contenuti che sono serviti sullo stesso server, vorremmo comprimere il nostro .css e .js

Una parola di avvertimento, alcuni browser o altre applicazioni di proposito mangle le intestazioni client che indicano quella compressione è supportata. Alcuni lo fanno per facilitare il loro lavoro in termini di sicurezza lato client (pensate ad applicazioni come la sicurezza internet di norton e così via). Puoi ignorarlo o cercare di aggiungere casi in più per riscrivere le richieste in modo che sembrino normali (i browser lo supportano, l'applicazione o il proxy l'hanno semplicemente abbandonato per semplificare la sua vita).

In alternativa, se si sta utilizzando il comando flush() per inviare l'output al browser in precedenza, e si sta applicando la compressione potrebbe essere necessario tamponare la fine della stringa con spazi bianchi per convincere il server a inviare i dati in anticipo .

+0

+1: Non sto gestendo quasi il traffico che sei, ma preferisco anche che il server lo gestisca. Ci sono uno o due avvertimenti: alcuni tipi di file audio non devono essere compressi, o i lettori multimediali si soffocano su di essi. Questo include Windows Media Player con file mp3. – Powerlord

+0

Anche se il problema era con Media Player 8, quindi potrebbe essere stato risolto già. – Powerlord

+0

In genere comprime solo gli elementi del tipo text/*, quindi seleziono alcuni altri tipi di contenuto (come application/json) per ottenere il resto. – preinheimer