Когда я пытаюсь загрузить файлы GZIP .js с помощью PHP, я получаю какую-то ошибку, связанную с php
-
03-07-2019 - |
Вопрос
Итак, я погуглил пару страниц и пришел к следующему решению:
Добавьте это в .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).Кроме того, необходим скрипт для объединения файлов (если только вы не делаете это как часть процесса сборки, но я нахожу это немного более утомительным).