Lorsque j'essaie d'utiliser des fichiers GZIP .js avec PHP, j'obtiens une sorte d'erreur liée à php

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

Question

D'accord, j'ai donc cherché dans Google quelques pages et j'ai proposé la solution suivante:

Ajouter ceci en .htaccess
#Active GZIP for php-files
php_flag zlib.output_compression On 
php_value zlib.output_compression_level 5

et ceci pour .js et .css:

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

Qui exécutera les scripts .js et .css comme php. La deuxième ligne comprend la page suivante:

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

Qui enverra l'en-tête " text / css " aux fichiers .css et " text / javascript " aux fichiers javascript. Jusqu'ici tout va bien. Le problème cependant, c’est avec quelques javascripts minifiés que j’utilise, j’obtiens une sorte d’erreur 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 />

ou:

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

Alors, y a-t-il une meilleure façon de faire cela? La seule option que je peux trouver est d'aller manuellement dans les fichiers .javascript et de & Corriger les erreurs & Quot; que php n'aime pas. Mais cela ne devrait-il pas être une solution plus facile?

Était-ce utile?

La solution

La cause de cette erreur est que les scripts contiennent <?. Par exemple, dans prettify.js, voici ceci:

/^[^<?]+/

Vous transmettez ceci à PHP, le moteur de PHP redémarre et voit un ].

inattendu.

Je choisirais la méthode de @ jonstjohn ou celle de @ cletus si vous avez besoin de plus de contrôle.

Autres conseils

Nous utilisons Apache Mod_Deflate et utilisons l'exemple de configuration présenté ici. . Fonctionne très bien sans piratage en PHP.

Je sers mes fichiers JS à partir d'un script PHP. Pas à cause de ce problème, mais je peux donc contrôler l'en-tête Expires et la mise en cache. Le modèle général est:

  • L'URL ressemble à /script/blah.1234567890.js;
  • Cette URL est générée à partir de mtime du fichier blah.js;
  • Cette URL est envoyée à un script js.php via une règle de réécriture dans le fichier .htaccess;
  • Le script vérifie le mtime passé. S'il est plus récent que le mtime de la version mise en cache, il génère une nouvelle version mise en cache à partir de tous mes fichiers JS (qui sont rassemblés dans un seul fichier puis minifiés avec JSMin);
  • Si mtime n'est pas plus récent que le script, la version en cache est simplement servie;
  • Dans tous les cas, le contenu est défini pour expirer dans un an.

L'horodatage de l'URL permet d'actualiser le fichier de script.

Maintenant, quel est le lien avec le gzipping? Simple. En haut de mon script js.php se trouve:

ob_start("ob_gzhandler")

qui active la compression gzip si le client le prend en charge (ainsi que l'utilisation de la mise en mémoire tampon de sortie).

Cela fonctionne vraiment vraiment.

Essayez de vous limiter à un seul fichier JS et un seul fichier CSS. Combinez-les si nécessaire. Je fais la même chose avec les fichiers CSS (pas de minification bien sûr).

L'avantage de cette solution est qu'elle repose uniquement sur l'activation de mod_rewrite. Aucune autre extension n'est nécessaire (ob_gzhandler est une partie standard de PHP). De plus, un script est nécessaire pour combiner les fichiers (à moins que vous ne le fassiez dans le cadre d’un processus de construction, mais je trouve cela un peu plus fastidieux).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top