Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ сТатия

Π₯отя ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ сТатия ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ gzip- ΠΈ bz2-совмСстимыС Ρ„Π°ΠΉΠ»Ρ‹ Π² локальной Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, ΠΎΠ½ΠΈ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΠ±Ρ‰ΠΈΡ… срСдств для компрСссии Π² сСтСвых ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, ΠΊΠ°ΠΊ ΠΈ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ срСдств для создания ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π΅Π· компрСссии с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π² компрСссируСмый. Для этих Ρ†Π΅Π»Π΅ΠΉ ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌ рСсурсам Π² любоС врСмя ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ сТатия.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ сТатия Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… ΠΈ хвостовых Π±Π»ΠΎΠΊΠΎΠ² Π°Ρ€Ρ…ΠΈΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ gzip. Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ сТатия Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΆΠΈΠΌΠ°ΡŽΡ‚ ΠΈ Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΡ€Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² компрСссируСмом ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ….

zlib.deflate ΠΈ zlib.inflate

zlib.deflate (компрСссия) ΠΈ zlib.inflate (дСкомпрСссия) ΡΠ²Π»ΡΡŽΡ‚ΡΡ рСализациями ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сТатия, описанных Π² » RFC 1951. Π€ΠΈΠ»ΡŒΡ‚Ρ€ deflate ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ ассоциативного массива. level опрСдСляСт, ΠΊΠ°ΠΊΠΎΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ компрСссии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ (1-9). ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ этого значСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΡ‘ΠΌΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π·Π° счёт увСличСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π²Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… уровня компрСссии: 0 (для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ компрСссии) ΠΈ -1 (Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ zlib -- Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π²Π½ΠΎ 6). window - это Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌ с основаниСм 2 ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠΊΠ½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° сТатия. ВысокиС значСния (Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ 15 -- 32768 Π±Π°ΠΉΡ‚) приводят ΠΊ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ компрСссии Π·Π° счёт роста Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ памяти, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π½ΠΈΠ·ΠΊΠΈΠ΅ значСния (Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ 9 -- 512 Π±Π°ΠΉΡ‚) приводят ΠΊ ΡƒΡ…ΡƒΠ΄ΡˆΠ΅Π½ΠΈΡŽ компрСссии Π·Π° счёт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ памяти. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° window ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ являСтся 15. memory опрСдСляСт ΠΌΠ°ΡΡˆΡ‚Π°Π± Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ памяти. ДопустимыС значСния находятся Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 1 (минимальноС Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅) Π΄ΠΎ 9 (максимальноС Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅). Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ памяти влияСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ Π½Π΅ влияСт Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ компрСссии являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ Π² качСствС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа (integer), вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ массив ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта.

ΠšΠΎΠΌΠΏΡ€Π΅ΡΡΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ zlib.* доступны, Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° zlib.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 zlib.deflate ΠΈ zlib.inflate

<?php

$params
= array('level' => 6, 'window' => 15, 'memory' => 9);

$original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo
"ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст Π΄Π»ΠΈΠ½ΠΎΠΉ " . strlen($original_text) . " символов.\n";

$fp = fopen('test.deflated', 'w');
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
fwrite($fp, $original_text);
fclose($fp);

echo
"Π‘ΠΆΠ°Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ " . filesize('test.deflated') . " Π±Π°ΠΉΡ‚.\n";
echo
"ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст:\n";
/* ИспользованиС readfile ΠΈ zlib.inflate для дСкомпрСсии Π½Π° Π»Π΅Ρ‚Ρƒ */
readfile('php://filter/zlib.inflate/resource=test.deflated');

/* Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄:

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст Π΄Π»ΠΈΠ½ΠΎΠΉ 70 символов.
Π‘ΠΆΠ°Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 56 Π±Π°ΠΉΡ‚.
ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст:
This is a test.
This is only a test.
This is not an important string.

*/

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 Упрощённая Ρ€Π°Π±ΠΎΡ‚Π° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° zlib.deflate

<?php

$original_text
= "This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo
"ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст Π΄Π»ΠΈΠ½ΠΎΠΉ " . strlen($original_text) . " символов.\n";

$fp = fopen('test.deflated', 'w');
/* Π—Π΄Π΅ΡΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ 6 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ компрСссии 6 */
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, 6);
fwrite($fp, $original_text);
fclose($fp);

echo
"Π‘ΠΆΠ°Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ " . filesize('test.deflated') . " Π±Π°ΠΉΡ‚.\n";

/* Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄:

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст Π΄Π»ΠΈΠ½ΠΎΠΉ 70 символов.
Π‘ΠΆΠ°Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 56 Π±Π°ΠΉΡ‚.

*/

bzip2.compress ΠΈ bzip2.decompress

Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ bzip2.compress ΠΈ bzip2.decompress Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ zlib-Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ ΠΎΠΏΠΈΡΡ‹Π²Π°Π»ΠΈΡΡŒ. Π€ΠΈΠ»ΡŒΡ‚Ρ€ bzip2.compress ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Π²ΠΈΠ΄Π΅ элСмСнтов ассоциативного массива: blocks являСтся цСлочислСнным (integer) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 1 Π΄ΠΎ 9 ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° количСство 100-ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² памяти для рСзСрвирования Π² качСствС Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ пространства. work - это Ρ‚Π°ΠΊ ΠΆΠ΅ цСлочислСнноС (integer) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 250, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ сколько усилий Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ компрСссии ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. ИзмСнСниС этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° влияСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ компрСссии. Ни Ρ€Π°Π·ΠΌΠ΅Ρ€ сТатого Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Π½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ объСм памяти Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этой настройки. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ bzip ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнноС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π€ΠΈΠ»ΡŒΡ‚Ρ€ bzip2.decompress ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ всСго ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ boolean-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ элСмСнт small ассоциативного массива. Когда small установлСн Π² true, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° bzip ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ Π΄Π΅ΠΊΠΎΠΌΠΏΡ€Π΅ΡΡΠΈΡŽ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ расходом памяти Π·Π° счёт пониТСния скорости.

ΠšΠΎΠΌΠΏΡ€Π΅ΡΡΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ bzip2.* доступны, Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° bz2.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 bzip2.compress ΠΈ bzip2.decompress

<?php

$param
= array('blocks' => 9, 'work' => 0);

echo
"ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ " . filesize('LICENSE') . " Π±Π°ΠΉΡ‚.\n";

$fp = fopen('LICENSE.compressed', 'w');
stream_filter_append($fp, 'bzip2.compress', STREAM_FILTER_WRITE, $param);
fwrite($fp, file_get_contents('LICENSE'));
fclose($fp);

echo
"Π‘ΠΆΠ°Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ " . filesize('LICENSE.compressed') . " Π±Π°ΠΉΡ‚.\n";

/* Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄:

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 3288 Π±Π°ΠΉΡ‚.
Π‘ΠΆΠ°Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 1488 Π±Π°ΠΉΡ‚.

*/
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 4 notes

up
8
Anonymous ΒΆ
10 years ago
To read a gzip encoded stream from http
<?php
$opts = [
    "http" => [
        "method" => "GET",
        "header" => [ "Accept-Encoding: gzip" ],
    ]
];
$ctx = stream_context_create($opts);
$f = fopen("http://php.net", "r", false, $ctx);
// check  stream_get_meta_data($f)["wrapper_data"] has "Content-Encoding: gzip"
stream_filter_append($f, "zlib.inflate", STREAM_FILTER_READ, ["window" => 30]);
echo stream_get_contents($f); // any stream processing
fclose($f);
up
2
bohwaz ΒΆ
7 years ago
Please note that there is currently a bug in this feature. ftell(), fseek() and fstat() functions cannot be used. Writing to a stream after using this function will not change the stream position as it should.

See bug: https://bugs.php.net/bug.php?id=49874

Also the zlib filters don't work with php://temp, php://memory and php://input streams, nothing is outputted to those streams.
up
0
TingSong ΒΆ
3 years ago
To decompress a gzipped stream:

<?php
$stream = fopen('https://example.com/some/file.txt.gz', 'rb');
stream_filter_append($stream, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15+16]);

// read the decompressed line directly
$line = fgets($stream);

// process the lines
?>

As the doc of zlib https://www.zlib.net/manual.html#Advanced

The 'window' parameter between 8 and 15 specified the window size from 2⁸ to 2¹⁡ bytes. It can be added by 16 for wrapping with gzip header and trailer instead of zlib wrapper.

And, window could be -8..-15 for unwrapping RAW deflate data.
up
-1
Anonymous ΒΆ
5 years ago
To use the zlib.inflate filter with data originally written using gzcompress() or zlib.deflate, set the window option to 15 as outlined here: https://bugs.php.net/bug.php?id=68556

<?php
$fh = fopen(file_name, 'rb');
stream_filter_append($fh, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15]);
$contents = stream_get_contents($fh);
fclose($fh);