Als ich nach GZIP Js-Dateien mit PHP versuchen, erhalte ich eine Art von PHP-bezogener Fehler

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

Frage

Okay, also habe ich ein paar Seiten gegoogelt und komme mit folgenden Lösung:

Fügen Sie diese in .htaccess
#Active GZIP for php-files
php_flag zlib.output_compression On 
php_value zlib.output_compression_level 5

und dies für Js und Css:

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

Welche Js sowie CSS als PHP-Skripte ausgeführt werden. Die zweite Zeile enthält die folgende Seite an:

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

Welche Header "text / css" sendet Dateien .css und "text / javascript" Javascript-Dateien. So weit, ist es gut. Das Problem ist jedoch mit ein paar minified Javascripts, die ich benutze ich eine Art von PHP-Fehler:

<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 />

oder:

<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 />

Also, gibt es einen besseren Weg, dies zu tun? Die einzige Option, die ich mit oben kommen kann manuell in gehen zu den .javascript Dateien und „die Fehler korrigieren“, dass PHP nicht mag. Aber sollte es nicht eine einfachere Lösung sein?

War es hilfreich?

Lösung

Der Grund, warum Sie diesen Fehler, wenn es darum, dass der Skripte enthält <?. Zum Beispiel in prettify.js ist dies:

/^[^<?]+/

Sie vorbei dies in PHP, so dass der PHP-Engine startet wieder in Gang und sieht eine unerwartete ].

Ich würde gehen mit @ jonstjohn Methode oder @ cletus ist, wenn Sie mehr Kontrolle benötigen.

Andere Tipps

Wir verwenden Apache mod_deflate und verwenden Sie die Beispielkonfiguration dort gezeigt . Funktioniert prima, ohne in PHP Hacking.

Ich diene eigentlich meine JS-Dateien von einem PHP-Skript. Nicht wegen dieses Problems, aber so kann ich steuern, der Header und Caching abläuft. Das allgemeine Modell ist:

  • Die URL ist so etwas wie /script/blah.1234567890.js;
  • Diese URL wird aus der mtime der blah.js Datei erzeugt wird;
  • Diese URL wird einen js.php Skript über eine Rewrite-Regel in der .htaccess gesendet;
  • Das Skript überprüft die mtime übergeben Wenn sein neuer als die mtime der Cache-Version eine neue Cache-Version von allen meinen JS-Dateien erzeugt (die in einer einzigen Datei zusammengefasst werden und dann minimierte mit JSMin);.
  • Wenn die mtime als das Skript nicht neuer ist, wird die Cache-Version einfach bedient;
  • In allen Fällen ist der Inhalt wird in einem Jahr nun auslaufen.

Der Zeitstempel in der URL können Sie die Skriptdatei für die Aktualisierung.

Nun, wie hat das mit Gzipping? Einfach. An der Spitze meiner js.php Skript ist:

ob_start("ob_gzhandler")

, die auf gzip Kompression dreht, wenn der Client unterstützt (wie auch die Ausgabe-Pufferung verwendet wird).

Es funktioniert wirklich, wirklich.

Versuchen Sie, und beschränken Sie sich auf genau eine JS und eine CSS-Datei. Kombinieren Sie sie, wenn nötig. Ich mache den gleichen Trick mit CSS-Dateien zu (kein minification natürlich).

Der Vorteil dieser Lösung ist es verlässt sich nur auf mod_rewrite aktiviert ist. Keine andere Erweiterung ist notwendig (ob_gzhandler ist ein fester Bestandteil von PHP). Dazu ein Skript ist erforderlich, um die Dateien zu kombinieren (es sei denn, Sie tun, dass im Rahmen eines Build-Prozesses, aber ich finde das ein bisschen langweilig).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top