<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/filters.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'filters.compression.php',
    1 => 'Фильтры сжатия',
    2 => 'Фильтры сжатия',
  ),
  'up' => 
  array (
    0 => 'filters.php',
    1 => 'Список доступных фильтров',
  ),
  'prev' => 
  array (
    0 => 'filters.convert.php',
    1 => 'Преобразующие фильтры',
  ),
  'next' => 
  array (
    0 => 'filters.encryption.php',
    1 => 'Шифрующие фильтры',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'appendices/filters.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="filters.compression" class="section">
  <h2 class="title">Фильтры сжатия</h2>

  <p class="simpara">
   Хотя <a href="wrappers.compression.php" class="link">обёртки сжатия</a>
   и создают gzip- и bz2-совместимые
   файлы в локальной файловой системе, они не предоставляют общих средств
   для компрессии в сетевых потоках, как и не предоставляют средств
   для создания потока без компрессии с последующим превращением
   в компрессируемый. Для этих целей к любым потоковым ресурсам в любое время
   применяют фильтры сжатия.
  </p>

  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Фильтры сжатия <em>не</em> генерируют заголовочных
    и хвостовых блоков архива, которые создают утилиты командной строки наподобие
    <code class="literal">gzip</code>. Фильтры сжатия только сжимают
    и распаковывают порции данных в компрессируемом потоке данных.
   </span>
  </p></blockquote>

  <div class="section" id="filters.compression.zlib">
   <h2 class="title">zlib.deflate и zlib.inflate</h2>
   <p class="simpara">
    <code class="literal">zlib.deflate</code> (компрессия)
    и <code class="literal">zlib.inflate</code> (декомпрессия) являются реализациями
    методов сжатия, описанных в
    <a href="https://datatracker.ietf.org/doc/html/rfc1951" class="link external">&raquo;&nbsp;RFC 1951</a>.
    Фильтр <code class="literal">deflate</code> принимает три аргумента, переданных
    в виде ассоциативного массива.

    <code class="parameter">level</code> определяет, какой уровень компрессии
    использовать (1-9). Повышение этого значения приведёт к уменьшению
    объёмов данных за счёт увеличения времени обработки. Существуют также два
    специальных уровня компрессии:
    0 (для отключения компрессии) и -1 (внутреннее значение по умолчанию
    библиотеки zlib -- на текущий момент равно 6).

    <code class="parameter">window</code> - это логарифм с основанием 2 от размера окна диапазона сжатия.
    Высокие значения (вплоть до 15 -- 32768 байт) приводят к улучшению
    компрессии за счёт роста необходимой памяти, в то время как низкие значения
    (вплоть до 9 -- 512 байт) приводят к ухудшению компрессии за счёт
    уменьшения необходимой памяти.
    Значением аргумента <code class="parameter">window</code> по умолчанию на текущий
    момент является <code class="literal">15</code>.

    <code class="parameter">memory</code> определяет масштаб резервируемой памяти.
    Допустимые значения находятся в диапазоне от 1 (минимальное резервирование)
    до 9 (максимальное резервирование). Такое резервирование памяти влияет
    только на скорость и не влияет на размер генерируемых данных.
   </p>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <span class="simpara">
     Так как уровень компрессии является наиболее часто используемым
     аргументом, вы можете передать только его в качестве обычного целого
     числа (integer), вместо того чтобы передавать массив из одного элемента.
    </span>
   </p></blockquote>
   <p class="simpara">
    Компрессионные фильтры zlib.* доступны, если включена поддержка
    <a href="ref.zlib.php" class="link">zlib</a>.
   </p>
   <div class="example" id="example-1">
    <p><strong>Пример #1 
     <code class="literal">zlib.deflate</code>
     и <code class="literal">zlib.inflate</code>
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$params </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'level' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">6</span><span style="color: #007700">, </span><span style="color: #DD0000">'window' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">15</span><span style="color: #007700">, </span><span style="color: #DD0000">'memory' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">9</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$original_text </span><span style="color: #007700">= </span><span style="color: #DD0000">"This is a test.\nThis is only a test.\nThis is not an important string.\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"Оригинальный текст длиной " </span><span style="color: #007700">. </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$original_text</span><span style="color: #007700">) . </span><span style="color: #DD0000">" символов.\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'test.deflated'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">'zlib.deflate'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_WRITE</span><span style="color: #007700">, </span><span style="color: #0000BB">$params</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">$original_text</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"Сжатый файл размером " </span><span style="color: #007700">. </span><span style="color: #0000BB">filesize</span><span style="color: #007700">(</span><span style="color: #DD0000">'test.deflated'</span><span style="color: #007700">) . </span><span style="color: #DD0000">" байт.\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"Оригинальный текст:\n"</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">/* Использование readfile и zlib.inflate для декомпресии на лету */<br /></span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">'php://filter/zlib.inflate/resource=test.deflated'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Генерирует вывод:<br /><br />Оригинальный текст длиной 70 символов.<br />Сжатый файл размером 56 байт.<br />Оригинальный текст:<br />This is a test.<br />This is only a test.<br />This is not an important string.<br /><br /> */</span></span></code></div>
    </div>

   </div>

   <div class="example" id="example-2">
    <p><strong>Пример #2 
     Упрощённая работа фильтра <code class="literal">zlib.deflate</code>
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$original_text </span><span style="color: #007700">= </span><span style="color: #DD0000">"This is a test.\nThis is only a test.\nThis is not an important string.\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"Оригинальный текст длиной " </span><span style="color: #007700">. </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$original_text</span><span style="color: #007700">) . </span><span style="color: #DD0000">" символов.\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'test.deflated'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">/* Здесь аргумент 6 указывает уровень компрессии 6 */<br /></span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">'zlib.deflate'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_WRITE</span><span style="color: #007700">, </span><span style="color: #0000BB">6</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">$original_text</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"Сжатый файл размером " </span><span style="color: #007700">. </span><span style="color: #0000BB">filesize</span><span style="color: #007700">(</span><span style="color: #DD0000">'test.deflated'</span><span style="color: #007700">) . </span><span style="color: #DD0000">" байт.\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">/* Генерирует вывод:<br /><br />Оригинальный текст длиной 70 символов.<br />Сжатый файл размером 56 байт.<br /><br /> */</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="section" id="filters.compression.bzip2">
   <h2 class="title">bzip2.compress и bzip2.decompress</h2>
   <p class="simpara">
    Фильтры <code class="literal">bzip2.compress</code>
    и <code class="literal">bzip2.decompress</code>
    работают аналогично zlib-фильтрам, которые уже описывались.

    Фильтр <code class="literal">bzip2.compress</code> принимает два аргумента в виде
    элементов ассоциативного массива:

    <code class="parameter">blocks</code> является целочисленным (integer) значением
    в диапазоне от 1 до 9 и указывает на количество 100-килобайтных блоков
    памяти для резервирования в качестве рабочего пространства.

    <code class="parameter">work</code> - это так же целочисленное (integer) значение
    в диапазоне от 0 до 250, определяющее сколько усилий нужно потратить на
    обычный метод компрессии перед переключением на медленный, но более
    надёжный метод. Изменение этого параметра влияет только на скорость
    компрессии. Ни размер сжатого результата, ни используемый объем памяти не
    изменяются при помощи этой настройки. Значение 0 указывает библиотеке bzip
    использовать собственное внутреннее значение по умолчанию.

    Фильтр <code class="literal">bzip2.decompress</code> принимает всего один аргумент,
    который может быть передан либо как обычное boolean-значение, либо как
    элемент <code class="parameter">small</code> ассоциативного массива.

    Когда <code class="parameter">small</code> установлен в <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, библиотека bzip
    совершит декомпрессию с минимальным расходом памяти за счёт понижения
    скорости.
   </p>

   <p class="simpara">
    Компрессионные фильтры bzip2.* доступны, если включена поддержка
    <a href="ref.bzip2.php" class="link">bz2</a>.
   </p>

   <div class="example" id="example-3">
    <p><strong>Пример #3 
     <code class="literal">bzip2.compress</code>
     и <code class="literal">bzip2.decompress</code>
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$param </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'blocks' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">9</span><span style="color: #007700">, </span><span style="color: #DD0000">'work' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"Оригинальный файл размером " </span><span style="color: #007700">. </span><span style="color: #0000BB">filesize</span><span style="color: #007700">(</span><span style="color: #DD0000">'LICENSE'</span><span style="color: #007700">) . </span><span style="color: #DD0000">" байт.\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'LICENSE.compressed'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">'bzip2.compress'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_WRITE</span><span style="color: #007700">, </span><span style="color: #0000BB">$param</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'LICENSE'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"Сжатый файл размером " </span><span style="color: #007700">. </span><span style="color: #0000BB">filesize</span><span style="color: #007700">(</span><span style="color: #DD0000">'LICENSE.compressed'</span><span style="color: #007700">) . </span><span style="color: #DD0000">" байт.\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">/* Генерирует вывод:<br /><br />Оригинальный файл размером 3288 байт.<br />Сжатый файл размером 1488 байт.<br /><br /> */</span></span></code></div>
    </div>

   </div>
  </div>
 </div><?php manual_footer($setup); ?>