Cuando trato de GZIP .js archivos usando PHP obtengo algún tipo de error relacionado con php

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

Pregunta

Bien, entonces busqué en Google un par de páginas y encontré la siguiente solución:

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

y esto para .js y .css:

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

Que ejecutará .js así como .css como scripts php. La segunda fila incluye la siguiente página:

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

Que enviará el encabezado " text / css " a archivos .css y " text / javascript " a archivos javascript. Hasta ahora tan bueno. Sin embargo, el problema es que con un par de javascripts minificados que uso obtengo algún tipo de error de 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 />

or:

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

Entonces, ¿hay alguna forma mejor de hacer esto? La única opción que se me ocurre es acceder manualmente a los archivos .javascript y & Quot; corregir los errores & Quot; A ese PHP no le gusta. ¿Pero no debería ser una solución más fácil?

¿Fue útil?

Solución

La razón por la que obtiene este error es que los scripts contienen <?. Por ejemplo, en prettify.js es esto:

/^[^<?]+/

Estás pasando esto a PHP, de modo que se inicia el motor PHP nuevamente y se ve un inesperado ].

Iría con el método de @ jonstjohn, o con @ cletus si necesita más control.

Otros consejos

Usamos Apache Mod_Deflate y utilizamos la configuración de ejemplo que se muestra allí . Funciona muy bien sin hackear en PHP.

Realmente sirvo mis archivos JS desde un script PHP. No por este problema, pero puedo controlar el encabezado y el almacenamiento en caché. El modelo general es:

  • La URL es algo así como /script/blah.1234567890.js;
  • Esa URL se genera desde el mtime del archivo blah.js;
  • Esa URL se envía a un script js.php a través de una regla de reescritura en .htaccess;
  • El script comprueba el mtime pasado. Si es más nuevo que el mtime de la versión en caché, genera una nueva versión en caché de todos mis archivos JS (que se clasifican en un solo archivo y luego se minimizan con JSMin);
  • Si el mtime no es más nuevo que el script, la versión en caché simplemente se sirve;
  • En todos los casos, el contenido caducará dentro de un año.

La marca de tiempo en la URL permite actualizar el archivo de script.

Ahora, ¿cómo se relaciona esto con el gzipping? Sencillo. En la parte superior de mi script js.php está:

ob_start("ob_gzhandler")

que activa la compresión gzip si el cliente lo admite (además de utilizar el búfer de salida).

Funciona realmente realmente.

Intenta limitarte exactamente a un JS y un archivo CSS. Combínalos si es necesario. También hago el mismo truco con los archivos CSS (no hay minificación, por supuesto).

La ventaja de esta solución es que solo depende de que mod_rewrite esté habilitado. No es necesaria otra extensión (ob_gzhandler es una parte estándar de PHP). Además, es necesario un script para combinar los archivos (a menos que lo haga como parte de un proceso de compilación, pero esto me parece un poco más tedioso).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top