Сейчас я пытаюсь обслуживать файлы CSS и JS с сервера, который не позволяет мне включить mod_gzip
или mod_deflate
. Поэтому я написал небольшой PHP-скрипт для сжатия с помощью GZIP и возврата пользователю.
Пример кода:
$filename = "style.css";
if (!file_exists($filename) || !($info = stat($filename))) {
header("HTTP/1.1 404 Not Found");
die();
}
header("Date: ".gmdate("D, j M Y H:i:s e", time()));
header("Cache-Control: max-age=2592000");
header("Last-Modified: ".gmdate("D, j M Y H:i:s e", $info['mtime']));
header("Etag: ".sprintf("\"%x-%x-%x\"", $info['ino'], $info['size'], $info['mtime']));
header("Accept-Ranges: bytes");
header("Cache-Control: Expires ".gmdate("D, j M Y H:i:s e", $info['mtime']+2592000));
header("Content-Type: text/html");
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
У меня сейчас две проблемы. Во-первых, у меня возникают проблемы с определением результирующего размера сжатого файла, чтобы сообщить браузеру длину содержимого. Обычно я бы включил эту строку:
header("Content-Length: ".$info["size"]);
Но, если я это сделаю, браузер зависает, пытаясь дождаться новых данных. Есть ли способ рассчитать общий размер? Или я должен игнорировать эту директиву заголовка.
Другая проблема заключается в том, что всякий раз, когда я просматриваю этот файл PHP в Firefox, он пытается загрузить результат. В Chrome он просто отображает его так, как я и ожидал. Есть предложения?
Редактировать: Благодаря SoapBox я заменил конец кода следующим:
header("Content-Encoding: gzip");
$compressed = gzencode(file_get_contents($filename), 5);
header("Content-Length: ".strlen($compressed));
die($compressed);
Это прекрасно работает для длины контента! Но я все еще заставляю Firefox загружать файл, а не отображать его. (
Редактировать еще раз: Вот модифицированный код конца кода, любезно предоставленный Cletus.
// Start buffered output
ob_start();
// Check for gzip capability
if (stripos($_SERVER['HTTP_ACCEPT_ENCODING'], "gzip") !== false) {
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
} else
echo file_get_contents($filename);
// Write the content length
header('Content-Length: '.ob_get_length());
ob_end_flush();
Я собираюсь начать новый вопрос, чтобы выяснить, почему Firefox продолжает пытаться загрузить файл.