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

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

Вопрос

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

Добавьте это в .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.Пока все идет хорошо.Проблема, однако, в том, что с парой уменьшенных javascripts, которые я использую, я получаю какую-то ошибку 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.Но разве это не должно быть более простым решением?

Это было полезно?

Решение

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

/^[^<?]+/

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

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

Другие советы

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

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

  • URL-адрес выглядит примерно так /script/blah.1234567890.js;
  • Этот URL-адрес генерируется из Время изменения в 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).Кроме того, необходим скрипт для объединения файлов (если только вы не делаете это как часть процесса сборки, но я нахожу это немного более утомительным).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top