Можно ли выдать файл gzip броузеру как запакованную gzip страницу?

detail

Новичок
Можно ли выдать файл gzip броузеру как запакованную gzip страницу?

На сервере лежит запакованный gzip-ом файл. Специальный скрипт по запросу пользователя должен отдать этот файл клиенту. Нужно 1) уменьшить трафик 2) уменьшить нагрузку на процессор.

Поскольку файл уже запакован в gzip, нет смысла распаковывать его и опять запаковывать для уменьшения трафика.

Допустим, надо выдать файл page.html.gz. Можно ли вообще выдать содержимое сжатого файла и дописать заголовки, чтобы клиент воспринял это как сжатую потоковым gzip страницу?

У меня тип файла не html, а редко используемый, размеры от нескольких килобайт до нескольких мегабайт.

Пробовал такое:
PHP:
header("Content-Type: application/octet-stream");
header("Content-Encoding: gzip");
header("Content-Disposition: inline; filename=\"new.spr\"");
header("Content-Length: 5570748");
readfile("new.spr.gz");
Файл 9 мегабайт, сжатый - 5. Опера раскодирует начало, потом пишет, что происходит ошибка раскодирования.
 

su1d

Старожил PHPClubа
всё должно работать.

попробуй вставить вначале: [m]session_cache_limiter[/m]('private');
 

detail

Новичок
Отчасти заработало. Опера правильно ругалась, потому что сам gz был битый. :) Паоквал его неправильно:

PHP:
gzwrite($file, implode("", file("new.spr")));
Заменил на

PHP:
gzwrite($file, fread($file2, filesize("new.spr")));
Теперь проблема в том, что сама Опера либо получает перекодированный файл, либо сама портит его. В общем, программа, которая должна читать файл, при его открытии просто исчезает с экрана. Апач не русский, тестирую на WinXP. Куда копать?
 

detail

Новичок
Нет, так тоже проблема с архивом. Опять битый gz. Как его нормально запаковать?
 

detail

Новичок
PHP:
 <?php
set_time_limit(1000);

$file = gzopen("test.spr.gz", "w9");
$file2 = fopen("test.spr", "r");

gzwrite($file, fread($file2, filesize("test.spr")));

print(filesize("test.spr"));

gzclose($file);
Код упаковки. 108 килобайт не пакуются, в файле получается 256 байт. Файл spr - это не текст, а бинарные данные.
 

MD

Guest
fopen("test.spr", "rb");
раз он бинарный то и читать его нужно соответсвенно!
 

MD

Guest
[m]gzopen[/m] - вот тут написано:
... but can also include a compression level ("wb9") ...
$file = gzopen("test.spr.gz", "w9"); - у тебя просто w9, может здесь собака на сене?
 

detail

Новичок
Мда, невнимательно читаю. Заработало. Спасибо большое!
 

Alien

Новичок
А нужно именно скриптом?

http://httpd.apache.org/docs/mod/mod_mime.html#addencoding

The AddEncoding directive maps the given filename extensions to the specified encoding type. MIME-enc is the MIME encoding to use for documents containing the extension. This mapping is added to any already in force, overriding any mappings that already exist for the same extension. Example:

AddEncoding x-gzip .gz
 

detail

Новичок
Лучше скриптом, чтобы пользователь не задавался вопросами и не распаковывал gzip.
 

Alien

Новичок
Ему же не архив отдают с файлом.
А приписывают к заголовкам "Content-Encoding: gzip"

Т.е. как раз твой случай.
Заодно уважим "2) уменьшить нагрузку на процессор."
 

detail

Новичок
Alien странно как-то работает ваша директива.

Я написал вот такой .htaccess:

Options FollowSymLinks
RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/$0.gz -f
RewriteRule ^.*$ /$0.gz [L]
AddEncoding x-gzip gz

Почему-то, если туда положить файл tar.gz, то броузер воспринимает файл как архив gz, а не потоковое сжатие. То же самое, если, например, запаковать архив gz им же (ведь такое может случиться, если кто-то по незнанию закачает такой архив. Можно дописать обработку такого случая, но лень) С другими типами файлов нормально.

Я так и не понял, куда вы предлагали поместить директиву AddEncoding. :)
 

Alien

Новичок
Спасибо, не моя она :) Я еще директивы к модулям не пишу.

Я не совсем понял смысл твоего реврайта, но надо писать без реврайтов

PHP:
  AddEncoding x-gzip gz
 

detail

Новичок
Автор оригинала: Alien
Я не совсем понял смысл твоего реврайта, но надо писать без реврайтов
PHP:
AddEncoding x-gzip gz
Рерайты нужны для того, чтобы пользователь запрашивал не .gz, а файл, который запакован и чтобы программа клиента соханяла не gz, а раскодированный файл. По моим экспериментам, если в адресе будет .gz, то броузер будет сохранять запакованный архив, а мне это как раз не нужно.
 

Линк

Guest
что такое x-gzip?
правильно
"нерегистрированный миме тип"
вполне логично что бравзер его сохраняет
а вот если content-type: gzip
тогда он распакует его на лету, и отобразит
 

Alien

Новичок
Линк, читай rfc-шки, они рулят.

из RFC2616
For compatibility with previous implementations of HTTP,
applications SHOULD consider "x-gzip" and "x-compress" to be
equivalent to "gzip" and "compress" respectively.
Браузеров, которым положить на "SHOULD" я не знаю. Ты знаешь?

"нерегистрированный миме тип"
В чем то ты прав. gzip писать правильней (я цитировал доку из апача ... хз когда ее обновляли :D ).

Почему у detail его браузер воспринимает gz как архив надо смотреть как именно он его шлет. Например, какой именно content-type сервер шлет. Не баг ли это эксплорера, который занимается переопределением типа по расширению и т.п.
 
Сверху