Quando provo a GZIP .js file utilizzando PHP ottengo un qualche tipo di errore relativo a PHP

StackOverflow https://stackoverflow.com/questions/612628

Domanda

Okay, ho cercato su Google un paio di pagine e ho trovato la seguente soluzione:

Aggiungi questo in .htaccess
#Active GZIP for php-files
php_flag zlib.output_compression On 
php_value zlib.output_compression_level 5

e questo per .js e .css:

AddHandler application/x-httpd-php .css .js
php_value auto_prepend_file /Library/WebServer/Documents/blog/code/Helpers/ContentHeader.php

Che eseguirà .js e .css come script php. La seconda riga include la seguente pagina:

<?php
    $pathInfo = pathinfo($_SERVER['PHP_SELF']);
    $extension = $pathInfo['extension'];

    if($extension == "css")
    {
        header("Content-type: text/css");
    }
    if($extension == "js")
    {
        header("Content-type: text/javascript");
    }
?>

Che invierà l'intestazione " text / css " ai file .css e " text / javascript " ai file javascript. Fin qui tutto bene. Il problema però è con un paio di javasmi minimizzati che uso ottengo un qualche tipo di errore php:

<br />
<b>Parse error</b>:  syntax error, unexpected ']' in <b>/Library/WebServer/Documents/blog/public/scripts/prettify/prettify.js</b> on line <b>18</b><br />

o

<br />
<b>Warning</b>:  Unexpected character in input:  '\' (ASCII=92) state=1 in <b>/Library/WebServer/Documents/blog/public/scripts/showdown.js</b> on line <b>29</b><br />
<br />
<b>Parse error</b>:  syntax error, unexpected '?' in <b>/Library/WebServer/Documents/blog/public/scripts/showdown.js</b> on line <b>29</b><br />

Quindi, c'è un modo migliore per farlo? L'unica opzione che posso trovare è quella di accedere manualmente ai file .javascript e & Quot; correggere gli errori & Quot; quel php non piace. Ma non dovrebbe essere una soluzione più semplice?

È stato utile?

Soluzione

Il motivo per cui ricevi questo errore è che gli script contengono <?. Ad esempio, in prettify.js è questo:

/^[^<?]+/

Lo stai passando a PHP, in modo da riavviare il motore PHP e vedere un ] inatteso.

Andrei con il metodo di @ jonstjohn, o di @ cletus se hai bisogno di più controllo.

Altri suggerimenti

Utilizziamo Apache Mod_Deflate e utilizziamo la configurazione di esempio mostrata lì . Funziona alla grande senza hacking in PHP.

In realtà offro i miei file JS da uno script PHP. Non a causa di questo problema, ma così posso controllare l'intestazione e la memorizzazione nella cache. Il modello generale è:

  • L'URL è simile a /script/blah.1234567890.js;
  • L'URL viene generato dal mtime del file blah.js;
  • L'URL viene inviato a uno script js.php tramite una regola di riscrittura in .htaccess;
  • Lo script controlla il mtime passato. Se è più recente del mtime della versione memorizzata nella cache, genera una nuova versione memorizzata nella cache da tutti i miei file JS (che vengono raccolti in un singolo file e quindi minimizzati con JSMin);
  • Se mtime non è più recente dello script, la versione memorizzata nella cache viene semplicemente pubblicata;
  • In tutti i casi, il contenuto scadrà tra un anno da adesso.

Il timestamp nell'URL consente di aggiornare il file di script.

Ora, come si collega al gzipping? Semplice. Nella parte superiore del mio script js.php c'è:

ob_start("ob_gzhandler")

che attiva la compressione gzip se il client la supporta (oltre a utilizzare il buffering dell'output).

Funziona davvero davvero.

Prova a limitarti esattamente a un file JS e un file CSS. Combinali, se necessario. Faccio lo stesso trucco anche con i file CSS (nessuna minificazione ovviamente).

Il vantaggio di questa soluzione consiste nel fatto che mod_rewrite è abilitato. Non è necessaria altra estensione (ob_gzhandler è una parte standard di PHP). Inoltre è necessario uno script per combinare i file (a meno che non lo facciate come parte di un processo di compilazione, ma lo trovo un po 'più noioso).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top