Когда я пытаюсь GZIP файлы .js с помощью PHP, я получаю какую-то ошибку, связанную с PHP - PullRequest
1 голос
/ 05 марта 2009

Хорошо, я прогуглил пару страниц и нашел следующее решение:

Добавьте это в .htaccess
#Active GZIP for php-files
php_flag zlib.output_compression On 
php_value zlib.output_compression_level 5

и это для .js и .css:

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

, который будет выполнять сценарии .js и .css как php. Второй ряд содержит следующую страницу:

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

Который отправит заголовок "text / css" в файлы .css и "text / javascript" в файлы javascript. Все идет нормально. Проблема, однако, в том, что я использую несколько миниатюрных javascript-кодов, и у меня появляется какая-то ошибка 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 />

или

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

Итак, есть ли лучший способ сделать это? Единственный вариант, который я могу придумать, - это вручную зайти в файлы .javascript и «исправить ошибки», которые не нравятся php. Но разве это не должно быть более простым решением?

Ответы [ 3 ]

6 голосов
/ 05 марта 2009

Мы используем Apache Mod_Deflate и используем пример конфигурации, показанный там. Отлично работает без взлома в PHP.

2 голосов
/ 05 марта 2009

Я на самом деле обслуживаю мои файлы JS из скрипта PHP. Не из-за этой проблемы, но поэтому я могу контролировать заголовок expires и кэширование. Общая модель:

  • URL-адрес похож на /script/blah.1234567890.js;
  • Этот URL-адрес создается из mtime файла blah.js;
  • Этот URL отправляется в скрипт js.php с помощью правила перезаписи в .htaccess;
  • Сценарий проверяет переданное mtime. Если оно более новое, чем mtime кэшированной версии, он генерирует новую кэшированную версию из всех моих файлов JS (которые объединены в один файл и затем сведены с помощью JSMin);
  • Если mtime не новее, чем сценарий, кэшированная версия просто обслуживается;
  • Во всех случаях срок действия контента истекает через год.

Отметка времени в URL-адресе позволяет обновить файл сценария.

Теперь, как это относится к gzipping? Просто. В верхней части моего скрипта js.php:

ob_start("ob_gzhandler")

, который включает сжатие gzip, если клиент поддерживает его (а также использует буферизацию вывода).

Работает действительно реально.

Попробуйте ограничиться только одним JS и одним CSS-файлом. Объедините их при необходимости. Я делаю то же самое с CSS-файлами (конечно, без минификации).

Преимущество этого решения в том, что оно зависит только от включенного mod_rewrite. Никаких других расширений не требуется (ob_gzhandler является стандартной частью PHP). Кроме того, необходим сценарий для объединения файлов (если вы не сделаете это как часть процесса сборки, но я нахожу это немного более утомительным).

1 голос
/ 05 марта 2009

Причина, по которой вы получаете эту ошибку, состоит в том, что сценарии содержат <?. Например, в prettify.js это:

/^[^<?]+/

Вы передаете это в PHP, чтобы снова запустить движок PHP и увидеть неожиданное ].

Я бы использовал метод @ jonstjohn или @ cletus, если вам нужно больше контроля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...