- GZip сжатие данных с использованием PHP
- Сжатие данных на PHP
- GZIP под Windows — существует ли?
- lantastic
- Фанат
- lantastic
- fixxxer
- fixxxer
- lovchy
- gzcompress
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 24 notes
- gzencode
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 11 notes
GZip сжатие данных с использованием PHP
Многие броузеры поддерживают gzip сжатые файлы в «прозрачном» для пользователя режиме. Для html страниц коэфициент сжатия методом GZip составляет 0.2-0.3, т.е. данные сжимаются в 3-5 раз, что даёт такое же ускорение закачки страницы при прочих равных условиях.
Эфект от сжатия снижается, если вы используете много графики (gif, jpeg, png), flash (swf), других мультимедиа. Но если большинство данных у вас текстовые и HTML страница занимает более 50кб — смело используйте сжатие.
Как узнать, поддерживает ли броузер сжатие?
Браузер при запросе страницы передает информацию о поддержке gzip. Если переменная окружения http_accept_encoding содержит «gzip» или «x-gzip», значит поддерживает. Узнать об этом в php можно проверив переменную $http_server_vars[‘http_accept_encoding’] на вхождение «gzip»;
Для того, чтобы использовать сжатие, PHP должен быть скомпилирован с библиотекой zlib. Её можна скачать здесь: http://www.gzip.org/zlib, но имеется она и в дистрибутиве php. При запуске «configure» нужно указать параметр -with-zlib или -with-zlib=/path/to/zlib. Пользователи windows должны прописать в php.ini «extension=php_zlib.dll» (php_zlib.dll должен быть в папке указанной в параметре «extension_dir=c:phpextensions»)
- Для сжатия страницы можно использовать два способа:
- Весь вывод делать не через echo, а в отдельную переменную.
- Весь вывод делать в буфер вывода, поставив в начале страницы ob_start()
Когда вывод страницы окончен, мы получаем содержимое буфера через сжимаем его функцией Перед выводом сжатой страницы нужно послать правильные заголовки И вывести сжатую страницу
Конечно можно все это делать ручками, а можно и использовать классы библиотеки pear «http_compress» и «cache_outputcompression». А ещё проще сохранить себе этот файл:
Сжатие данных на PHP
Многие броузеры поддержывают gzip сжатые файлы в «прозрачном» для пользователя режиме.
Для текстовых файлов (html страниц) коефициент сжатия этим методом составляет 0.2-0.3,
т.е. данные сжимаются в 3-5 раз (на бОльших файлах — больше), что даёт такое же ускорение закачки страницы при других равных условиях.
Что снижает эфективность использования сжатия данных
Ефект от сжатия снижается, если вы используете много графики (gif, jpeg, png), flash (swf), других мультимедиа.
Но если большинство данных у вас текстовые и ХТМЛ страница занимает более 50кб — смело используйте сжатие.
Ефект от использования сжатия снижается также при использовании современных модемных протоколов.
Вот что говорят их производители:
Протоколы сжатия данных (v.44/v.42 bis/mnp 5) и коррекции ошибок (v.42/mnp 2-4) поддерживаются для максимизации пропускной способности и проверки целостности передачи. v.44 более эфективный метод сжатия чем v.42 bis, что существенно увеличивает возвратную пропускную способность и таким образом, уменьшая время закачки для типов файлов, используемых в Интернет, таких какe Веб-страницы и несжатая графика, аудио, документы. Сжатие по протоколу v.44 может достигать уровня более чем на 25% эфективнее чем v.42bis. Типичный коефициент сжатия для v.44 на Веб-страницах около 6-1, что в конечном итоге дает пропускную способность до 300 kbps для 56-kbps соединений.
Поэтому эфект во времени загрузки может быть не совсем ощутимый. Тем не менее использование сжатия данных оправдано. Во-первых, алгоритм gzip более эфективный апаратного сжатия данных (он всего на 17% уступает rar-формату и на 2% — zip), в большей части благодаря тому, что вы сжимаете весь файл заразом, а модем — только текущие пакеты. Во-вторых, суммарная пропускная способность канала всегад меньше наиболее его «тонкого» места, т.е. если на какой то стадии используется более старый протокол, эфекта от апаратного сжатия конечный пользователь не получит.
Как узнать, поддерживает ли броузер сжатие
Если переменная окружения http_accept_encoding содержит «gzip» или «x-gzip», значит поддерживает. Узнать об этом в php можно проверив переменную $http_server_vars[‘http_accept_encoding’] на вхождение «gzip»;
php имеет встроенные функции сжатия?
Для того, чтобы использовать сжатие, ПХП должен быть скомпилирован с библиотекой zlib. Её можна скачать здесь: http://www.gzip.org/zlib, но имеется она и в дистрибутиве php. При запуске «configure» нужно указать параметр —with-zlib или —with-zlib=/path/to/zlib (Если вы используете быблиотеку не из дистрибутива). Пользователи windows должны прописать в php.ini «extension=php_zlib.dll» (Естественно, php_zlib.dll должен быть в папке указанной в параметре «extension_dir=c:phpextensions»)
Насколько быстро работает фунцкция сжатия?
На процессоре p166mmx gzencode сжимает около 600-700 kb в секунду
Как сжать страницу
Для сжатия страницы можно использовать два способа:
Весь вывод делать не через echo, а в отдельную переменную.
Весь вывод делать в буфер вывода, поставив в начале страницы
GZIP под Windows — существует ли?
lantastic
Новичок
GZIP под Windows — существует ли?
Работаю под Windows. Часто требуется заливать дампы больших таблиц в phpMyAdmin на хостинге. В формате .txt — не очень удобно. А phpMyAdmin понимает еще и gz-файлы — можно ли сжать в gz-архив под Windows?
Фанат
oncle terrible
lantastic
Новичок
ok
приучаешь пользоваться google что ли? что если всегда на форуме будут отвечать google.com?
tеam neko
php.spb.ru
зачем нам сайт gzip? я конечно не пробовал, но там будет либо страшная виндовая портироаванная фигня, либо консольная
А вот на http://7-zip.org/ есть тулза (GUI/консоль) удобством напоминающая winrar, понимающая 7z, ZIP, CAB, RAR, ARJ, GZIP, BZIP2, Z, TAR, CPIO, RPM and DEB. Это отличное дополнение к самому винрару. Настраивается как плагин в Фаре, чтобы входить в архив как папку.
fixxxer
php.spb.ru
Ты пробовал заставить работать TAR и BZ2 в фаре? Я как-то пробовал, но не получилось и разбираться с особенностями командных строк было лень. А 7-zip запустил — все работает и даже само настаивает Фар. Если для входа в TAR использовать WinRar.exe, тогда конечно разницы никакой.
На главной странице 7-zip написано в списке фич:
-Powerful File Manager
-Powerful command line version
-Plugin for FAR Manager
Есть русская локализация, входит в дистрибутив. По качеству не хуже Winrar’а. Не шаривари (как рар), кушать не просит.
fixxxer
lovchy
nacido para cifrar
«я конечно не пробовал, но там будет либо страшная виндовая портироаванная фигня, либо консольная»
Там будет портрированная консольная. И что в этом такого плохого?
php.spb.ru
Хочешь сказать, что А лучше Б?
а) только консольная утилита
б) консольная и ГУИшная в одном флаконе, инталляция автоматически настраивает консольную версию на те программы, где и нужна консоль — плагин Фара
А просто о портировании скажу, да — иногда это плохо. Например, криворукий cygwin для работы некоторых портированных программа каждые полсекунды открывал локальное соединение для синхронизации своих потоков (и сразу закрывал без передачи данных). Полнейшее извращение, из-за которого приходилось Файрвол отключать.
fixxxer
Да, возможно. Я уже фаром пользуюсь наверно лет 8, поэтому все его настройки в реестре у меня живут с тех времен, когда там pkzip/pkunzip’ы всякие были вписаны. С дефолтными настройками не ставил.
gzcompress
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
gzcompress — Сжать строку
Описание
Данная функция сжимает строку используя формат данных ZLIB .
Подробнее про алгоритм сжатия ZLIB см. документ «» Формат сжатия ZLIB. Спецификация версии 3.3» (RFC 1950).
Это не то же самое, что и gzip-сжатие, которое включает в себя некоторые данные заголовка. Информацию о gzip-сжатии см. gzencode() .
Список параметров
Данные для сжатия.
Уровень сжатия. Целое число от 0 до 9 (0 — без сжатия, 9 — максимальное сжатие).
Если используется значение -1, то будет установлен принятый в библиотеке zlib по умолчанию уровень сжатия, который равен 6.
Одна из констант ZLIB_ENCODING_* .
Возвращаемые значения
Сжатая строка или false в случае ошибки.
Примеры
Пример #1 Пример использования gzcompress()
Смотрите также
- gzdeflate() — Сжимает строку
- gzinflate() — Распаковать сжатую строку
- gzuncompress() — Распаковать сжатую строку
- gzencode() — Создать сжатую строку gzip
User Contributed Notes 24 notes
Did some simple benchmarking of gzcompress() this morning on a lightly-loaded Fedora 12 server with an AMD Phenom II 940 (quad-core) rocking 8 gigs of ram and executing PHP 5.3.2.2 as an Apache module:
Compression benchmark: (level, time, size (%)):
0: 0.000373 — 82.08 kB (100.02%)
1: 0.000914 — 19.61 kB (23.90%)
2: 0.000951 — 18.88 kB (23.01%)
3: 0.000999 — 18.43 kB (22.46%)
4: 0.001498 — 17.65 kB (21.51%)
5: 0.001744 — 17.09 kB (20.82%)
6: 0.002060 — 16.88 kB (20.57%)
7: 0.002233 — 16.85 kB (20.53%)
8: 0.002808 — 16.71 kB (20.36%)
9: 0.002928 — 16.71 kB (20.36%)
The time code evaluates to:
1. Get start microtime
2. Call gzcompress
3. Get end microtime
4. Report average duration of 100 cycles
The 82.08 kB was a copied and pasted string of two actual, PHP-generated pages we use on our intranet. Running some rough calculations, the time it takes to compress the data at level 9 will never be larger than the time it takes to transmit slightly-less compressed data at levels 6 or lower. In other words, in our application, we have no reason not to fully-compress each PHP script’s output.
gzencode
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
gzencode — Создать сжатую строку gzip
Описание
Эта функция возвращает сжатую версию входных данных data , аналогично выводу программы gzip.
Список параметров
Данные для кодирования.
Уровень сжатия. 0 — без сжатия, 9 — максимальное сжатие. Если не указано, будет использоваться уровень сжатия по умолчанию библиотеки zlib.
Режим сжатия, может быть FORCE_GZIP (по умолчанию) или FORCE_DEFLATE .
До PHP 5.4.0 в случае использования FORCE_DEFLATE , возвращалась строка, сжатая по стандартному алгоритму zlib deflate (с заголовками zlib) после заголовка файла gzip, но без проверочной суммы crc32 в конце.
Начиная с версии PHP 5.4.0, использование константы FORCE_DEFLATE генерирует вывод, совместимый с RFC 1950, состоящий из заголовка zlib, сжатых данных и контрольной суммы Adler.
Возвращаемые значения
Сжатая строка или false в случае ошибки.
Примеры
Возвращаемые данные будут содержать соответствующие заголовки и структуры данных как в обычном .gz-файле, например:
Пример #1 Создание файла gzip
Смотрите также
User Contributed Notes 11 notes
Had some trouble finding the correct way to send a Content-Length header with HTTP compression.
The pitch is to use gzencode (not gzdeflaten not gzcompress).
// disable ZLIB ouput compression
ini_set ( ‘zlib.output_compression’ , ‘Off’ );
// compress data
$gzipoutput = gzencode ( $output , 6 );
// various headers, those with # are mandatory
header ( ‘Content-Type: application/x-download’ );
header ( ‘Content-Encoding: gzip’ ); #
header ( ‘Content-Length: ‘ . strlen ( $gzipoutput )); #
header ( ‘Content-Disposition: attachment; filename=»myfile.name»‘ );
header ( ‘Cache-Control: no-cache, no-store, max-age=0, must-revalidate’ );
header ( ‘Pragma: no-cache’ );
// output data
echo $gzipoutput ;
doing like this and so on
( ‘output.gz’ , gzencode ( file_get_contents ( ‘input.file’ ), 9 ));
?>
(complete file reading)
may cause memory overflow (Fatal error: Allowed memory size of ..), so it’s better to read by parts/bytes.
here is my clean up of supaplex %at% pcbkits %d0t% c0m
submission above.
function alt_gzdecode($gzdatadecode) <
// seed with microseconds since last «whole» second.
mt_srand((float)microtime()*1000000);
$eh=»/tmp/php-» . md5(mt_rand(0,mt_getrandmax())) . «.gz»;
if(file_exists($eh))<
$gzf=fopen($eh,»w»);
fwrite($gzf,$gzdatadecode);
fclose($gzf);
$gzf = gzopen ($eh, «r»);
$gzdatadecode=gzpassthru($gzf);
unlink($eh);
return $gzdatadecode;
>else <
return ‘File ‘.$eh.’ was not found.’;
>
>
The 10 byte string in gzencode is the standard gzip header. The first two bytes (1f 8b) define the return as a gzip file, the third byte (08) means that the body is compressed using the «deflate» algorithm. The rest is padding (00)’s.
Technically, I believe one should check if the third byte is hex 08 and if so strip off the first ten bytes and last four bytes and run inflate on it. The last four bytes are file size and checksum bits.
In practice, you can get away with just stripping the first 10 bytes and running inflate on it.
Hope this helps,
function compressFile(string $filePath): ?string
<
$compressedFile = $filePath.».gz»;
$data = implode(«,», file($filePath));
$gzdata = gzencode($data, 9);
$fp = fopen($compressedFile, «w»);
$successWrite = fwrite($fp, $gzdata);
fclose($fp);
if($successWrite === false) <
return null;
>
Aaron G. 07-Aug-2004 03:29 posted the excellent function gzdecode() (SEE BELOW)
BUGFIX: Change: if($flags & 1) to . if($flags & 2)
Unfortunately the function gzencode() does NOT append a CRC! So the previous version worked with output of gzencode but not with output of the gzip program itself.
I was almost discouraged when I didn’t find a gzdecode() function! However, fear not, for I’ll contribute my work. 🙂
function alt_gzdecode($str) <
// seed with microseconds since last «whole» second.
mt_srand((float)microtime()*1000000);
$eh=»/tmp/php-» . md5(mt_rand(0,mt_getrandmax())) . «.gz»;
$fd = gzopen ($eh, «r»);
$str=gzpassthru($fd);
unlink($eh);
It’s only ugly point is that it does not check to see if the file already exists. You may also have to adjust reference names like $str and $fd if they stomp on your code. (Sorry, but this is all you get atm! ;> ) If your conserned about a race condition, cry for a internal gzdecode() function that actualy functions.
I spent about 3 hours straight debugging this problem. I know the input data was valid, becuase I validated it with MD5() to compare to the md5’s I had made of the input data before hand. I’m not sure whats up with gzuncompress or gzinflate, but this works in its place . . .
Well, I was looking for a gzdecode too and didn’t consider the temporary file example above to be very elegant.
However, as is noted in the very first comment: gzencode() only adds a 10 byte header.
I don’t quite know what this header is supposed to be used for, but gzinflate() certainly doesn’t like it, so I stripped it off:
function my_gzdecode($string) <
$string = substr($string, 10);
return gzinflate($string);
>
That’s useful to read HTTP-Connections that were compressed by mod_gzip.
—
Henryk Pl�tz
Gr��e aus Berlin
function alt_gzdecode($str) <
// seed with microseconds since last «whole» second
mt_srand((float)microtime()*1000000);
$eh=»/tmp/php-» . md5(mt_rand(0,mt_getrandmax())) . «.gz»;
$fd = gzopen ($eh, «r»);
while (1==1) <
$s=gzread($fd,10240);
if («$s» == «») <
break;
>
$str=$str . $s;
>
unlink($eh);