<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/wrappers.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'wrappers.php.php',
    1 => 'php://',
    2 => 'Доступ к различным потокам ввода-вывода',
  ),
  'up' => 
  array (
    0 => 'wrappers.php',
    1 => 'Протоколы и обёртки',
  ),
  'prev' => 
  array (
    0 => 'wrappers.ftp.php',
    1 => 'ftp://',
  ),
  'next' => 
  array (
    0 => 'wrappers.compression.php',
    1 => 'zlib://',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/wrappers/php.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="wrappers.php" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">php://</h1>
  <p class="refpurpose"><span class="refname">php://</span> &mdash; <span class="dc-title">Доступ к различным потокам ввода-вывода</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-wrappers.php-description">
  <h3 class="title">Описание</h3>
  <p class="para">
   В PHP предусмотрели ряд потоков ввода-вывода, которые открывают
   доступ к собственным потокам ввода-вывода PHP, к стандартным файловым дескрипторам ввода, вывода
   и ошибок, к временным файловым потокам в памяти и на диске, и фильтрам, которые
   умеют манипулировать другими файловыми ресурсами по мере их считывания
   или записи.
  </p>

  <div class="refsect2 unknown-1" id="wrappers.php.std">
   <h4 class="title">php://stdin, php://stdout и php://stderr</h4>
   <p class="simpara">
    Потоки <var class="filename">php://stdin</var>, <var class="filename">php://stdout</var>
    и <var class="filename">php://stderr</var> открывают прямой доступ к соответствующему потоку
    ввода или вывода PHP-процесса. Поток указывает на копию файлового
    дескриптора, поэтому, если открыть
    <var class="filename">php://stdin</var>
    а потом закрыть его, закроется только копия дескриптора — фактический
    поток, на который ссылается <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong>, останется неизменным.
    Рекомендуется просто использовать константы <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong>,
    <strong><code><a href="reserved.constants.php#constant.stdout">STDOUT</a></code></strong> и <strong><code><a href="reserved.constants.php#constant.stderr">STDERR</a></code></strong> вместо ручного
    открытия потоков через эти обёртки.
   </p>
   <p class="simpara">
    Поток <var class="filename">php://stdin</var> доступен только для чтения, тогда как
    потоки <var class="filename">php://stdout</var> и <var class="filename">php://stderr</var> —
    только для записи.
   </p>
  </div>


  <div class="refsect2 unknown-4" id="wrappers.php.input">
   <h4 class="title">php://input</h4>
   <p class="simpara">
    Поток <var class="filename">php://input</var> — поток только для чтения, который разрешает
    читать необработанные данные из тела запроса.
    Поток <var class="filename">php://input</var> недоступен в POST-запросах
    с типом кодирования <code class="literal">enctype=&quot;multipart/form-data&quot;</code>, если включили
    опцию
    <a href="ini.core.php#ini.enable-post-data-reading" class="link">enable_post_data_reading</a>.
   </p>
  </div>


  <div class="refsect2 unknown-7" id="wrappers.php.output">
   <h4 class="title">php://output</h4>
   <p class="para">
    Поток <var class="filename">php://output</var> — поток только для записи, который разрешает
    записывать данные в механизм буфера вывода так же, как это делают языковые конструкции
    <span class="function"><a href="function.print.php" class="function">print</a></span> и <span class="function"><a href="function.echo.php" class="function">echo</a></span>.
   </p>
  </div>


  <div class="refsect2 unknown-10" id="wrappers.php.fd">
   <h4 class="title">php://fd</h4>
   <p class="simpara">
    Поток <var class="filename">php://fd</var> разрешает прямой доступ к файловому
    дескриптору. Например, <var class="filename">php://fd/3</var> относится к файловому
    дескриптору 3.
   </p>
  </div>


  <div class="refsect2 unknown-13" id="wrappers.php.memory">
   <h4 class="title">php://memory и php://temp</h4>
   <p class="simpara">
    Потоки <var class="filename">php://memory</var> и <var class="filename">php://temp</var> —
    потоки чтения и записи, которые разрешают сохранять временные данные в файлоподобной
    обёртке. Единственная разница между ними заключается в том, что
    поток <var class="filename">php://memory</var> будет всегда хранить данные в оперативной памяти,
    тогда как <var class="filename">php://temp</var> будет использовать временный файл, как только
    объем хранимой информации достигнет предопределённого предела (по умолчанию 2 МБ).
    Расположение этого временного файла определяется аналогично функции
    <span class="function"><a href="function.sys-get-temp-dir.php" class="function">sys_get_temp_dir()</a></span>.
   </p>
   <p class="simpara">
    Ограничением памяти для потока <var class="filename">php://temp</var> управляют путём
    добавления суффикса <code class="literal">/maxmemory:NN</code>, где <code class="literal">NN</code> —
    максимальный размер данных в байтах для хранения в памяти перед тем как PHP создаст временный
    файл.
   </p>
   <div class="caution"><strong class="caution">Предостережение</strong>
    <p class="simpara">
     Отдельным PHP-модулям иногда требуется стандартный поток ввода-вывода
     и модули могут попытаться преобразовать заданный поток в стандартный поток ввода-вывода.
     Это преобразование может завершиться ошибкой для потоков памяти, поскольку для такого приведения
     необходима функция <span class="function"><strong>fopencookie()</strong></span> языка C.
     Такая функция языка C <em>недоступна</em> в операционных системах Windows.
    </p>
   </div>
  </div>


  <div class="refsect2 unknown-16" id="wrappers.php.filter">
   <h4 class="title">php://filter</h4>
   <p class="simpara">
    Поток <var class="filename">php://filter</var> — вид мета-обёртки, которая разрешает
    применять <a href="filters.php" class="link">фильтры</a>
    к потоку во время открытия. Это полезно при работе с универсальными файловыми функциями
    наподобие <span class="function"><a href="function.readfile.php" class="function">readfile()</a></span>, <span class="function"><a href="function.file.php" class="function">file()</a></span> и <span class="function"><a href="function.file-get-contents.php" class="function">file_get_contents()</a></span>,
    где иначе нет возможности применить фильтр к потоку до считывания
    содержимого.
   </p>
   <p class="para">
    Поток <var class="filename">php://filter</var> принимает следующие параметры
    как часть своего пути. В одном пути можно указать несколько цепочек фильтров.
    Пожалуйста, ознакомьтесь с примерами и особенностями при
    использовании этих параметров.
   </p>
   <p class="para">
    <table class="doctable table">
     <caption><strong>Параметры для php://filter</strong></caption>
     
      <thead>
       <tr>
        <th>Название</th>
        <th>Описание</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td>
         <code class="literal">resource=&lt;поток для фильтрации&gt;</code>
        </td>
        <td>
         Этот параметр обязателен. Он указывает поток, который
         необходимо отфильтровать.
        </td>
       </tr>

       <tr>
        <td>
         <code class="literal">read=&lt;список фильтров для применения к цепочке чтения&gt;</code>
        </td>
        <td>
         Этот параметр необязателен. Здесь можно указать одно или несколько имён фильтров
         через символ вертикальной черты (<code class="literal">|</code>).
        </td>
       </tr>

       <tr>
        <td>
         <code class="literal">write=&lt;список фильтров для применения к цепочке записи&gt;</code>
        </td>
        <td>
         Этот параметр необязателен. Здесь можно указать одно или несколько имён фильтров
         через символ вертикальной черты (<code class="literal">|</code>).
        </td>
       </tr>

       <tr>
        <td>
         <code class="literal">&lt;список фильтров для применения к обеим цепочкам&gt;</code>
        </td>
        <td>
         Любые списки фильтров без префикса <code class="literal">read=</code>
         или <code class="literal">write=</code> будут применяться как к цепочкам чтения, так и к цепочкам
         записи.
        </td>
       </tr>

      </tbody>
     
    </table>

   </p>
  </div>

 </div>


 <div class="refsect1 options" id="refsect1-wrappers.php-options">
  <h3 class="title">Опции</h3>
  <p class="para">
   <table class="doctable table">
    <caption><strong>
     Краткое описание обёртки (для потока <code class="literal">php://filter</code> смотрите
     информацию по фильтруемой обёртке)
    </strong></caption>
    
     <thead>
      <tr>
       <th>Атрибут</th>
       <th>Поддержка</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>Ограничение по директиве <a href="filesystem.configuration.php#ini.allow-url-fopen" class="link">allow_url_fopen</a></td>
       <td>Нет</td>
      </tr>

      <tr>
       <td>Ограничение по директиве <a href="filesystem.configuration.php#ini.allow-url-include" class="link">allow_url_include</a></td>
       <td>
        только потоки <code class="literal">php://input</code>,
        <code class="literal">php://stdin</code>,
        <code class="literal">php://memory</code>
        и <code class="literal">php://temp</code>.
       </td>
      </tr>

      <tr>
       <td>Чтение</td>
       <td>
        только потоки <code class="literal">php://stdin</code>,
        <code class="literal">php://input</code>,
        <code class="literal">php://fd</code>,
        <code class="literal">php://memory</code>
        и <code class="literal">php://temp</code>.
       </td>
      </tr>

      <tr>
       <td>Запись</td>
       <td>
        только потоки <code class="literal">php://stdout</code>,
        <code class="literal">php://stderr</code>,
        <code class="literal">php://output</code>,
        <code class="literal">php://fd</code>,
        <code class="literal">php://memory</code>
        и <code class="literal">php://temp</code>.
       </td>
      </tr>

      <tr>
       <td>Добавление</td>
       <td>
        только потоки <code class="literal">php://stdout</code>,
        <code class="literal">php://stderr</code>,
        <code class="literal">php://output</code>,
        <code class="literal">php://fd</code>,
        <code class="literal">php://memory</code>
        и <code class="literal">php://temp</code>. (Эквивалентно записи)
       </td>
      </tr>

      <tr>
       <td>Одновременное чтение и запись</td>
       <td>
        только потоки <code class="literal">php://fd</code>,
        <code class="literal">php://memory</code>
        и <code class="literal">php://temp</code>.
       </td>
      </tr>

      <tr>
       <td>Поддержка функции <span class="function"><a href="function.stat.php" class="function">stat()</a></span></td>
       <td>
        нет. Тем не менее, потоки <code class="literal">php://memory</code>
        и <code class="literal">php://temp</code> поддерживают функцию <span class="function"><a href="function.fstat.php" class="function">fstat()</a></span>.
       </td>
      </tr>

      <tr>
       <td>Поддержка функции <span class="function"><a href="function.unlink.php" class="function">unlink()</a></span></td>
       <td>Нет</td>
      </tr>

      <tr>
       <td>Поддержка функции <span class="function"><a href="function.rename.php" class="function">rename()</a></span></td>
       <td>Нет</td>
      </tr>

      <tr>
       <td>Поддержка функции <span class="function"><a href="function.mkdir.php" class="function">mkdir()</a></span></td>
       <td>Нет</td>
      </tr>

      <tr>
       <td>Поддержка функции <span class="function"><a href="function.rmdir.php" class="function">rmdir()</a></span></td>
       <td>Нет</td>
      </tr>

      <tr>
       <td>Поддержка функции <span class="function"><a href="function.stream-select.php" class="function">stream_select()</a></span></td>
       <td>
        только потоки <code class="literal">php://stdin</code>,
        <code class="literal">php://stdout</code>,
        <code class="literal">php://stderr</code>,
        <code class="literal">php://fd</code>
        и <code class="literal">php://temp</code>.
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>
 </div>
 

 <div class="refsect1 examples" id="refsect1-wrappers.php-examples">
  <h3 class="title">Примеры</h3>
  <div class="example" id="example-1">
   <p><strong>Пример #1 php://temp/maxmemory</strong></p>
   <div class="example-contents"><p>
    Этот необязательный параметр устанавливает ограничение памяти перед началом
    работы потока <var class="filename">php://temp</var> с временным файлом.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// Устанавливаем предел в 5 МБ<br /></span><span style="color: #0000BB">$fiveMBs </span><span style="color: #007700">= </span><span style="color: #0000BB">5 </span><span style="color: #007700">* </span><span style="color: #0000BB">1024 </span><span style="color: #007700">* </span><span style="color: #0000BB">1024</span><span style="color: #007700">;<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">"php://temp/maxmemory:</span><span style="color: #0000BB">$fiveMBs</span><span style="color: #DD0000">"</span><span style="color: #007700">, </span><span style="color: #DD0000">'r+'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">fputs</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"hello\n"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Читаем данные, которые записали на предыдущем шаге<br /></span><span style="color: #0000BB">rewind</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">stream_get_contents</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-2">
   <p><strong>Пример #2 php://filter/resource=&lt;поток для фильтрации&gt;</strong></p>
   <div class="example-contents"><p>
    Параметр указывают
    в конце спецификации <var class="filename">php://filter</var>.
    Значение параметра указывает на поток, который требуется отфильтровать.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* Это просто эквивалентно:<br />  readfile("http://www.example.com");<br />  поскольку на самом деле фильтры не указали */<br /><br /></span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">"php://filter/resource=http://www.example.com"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-3">
   <p><strong>Пример #3 php://filter/read=&lt;список фильтров для применения к цепочке чтения&gt;</strong></p>
   <div class="example-contents"><p>
    Этот параметр принимает один или более
    имён фильтров, разделённых вертикальной чертой <code class="literal">|</code>.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* Скрипт выведет содержимое ресурса<br />  www.example.com полностью в верхнем регистре */<br /></span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">"php://filter/read=string.toupper/resource=http://www.example.com"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Скрипт выполняет аналогичную работу,<br />  но также кодирует данные алгоритмом ROT13 */<br /></span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">"php://filter/read=string.toupper|string.rot13/resource=http://www.example.com"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-4">
   <p><strong>Пример #4 php://filter/write=&lt;список фильтров для применения к цепочке записи&gt;</strong></p>
   <div class="example-contents"><p>
    Параметр принимает одно
    или несколько имён фильтров, разделённых вертикальной чертой <code class="literal">|</code>.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* Скрипт отфильтрует строку "Hello World"<br />  через фильтр rot13, затем запишет результат<br />  в файл example.txt в текущем каталоге */<br /></span><span style="color: #0000BB">file_put_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">"php://filter/write=string.rot13/resource=example.txt"</span><span style="color: #007700">, </span><span style="color: #DD0000">"Hello World"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-5">
   <p><strong>Пример #5 Недоступность повторного обращения к потокам php://memory и php://temp</strong></p>
   <div class="example-contents"><p>
    Потоки <var class="filename">php://memory</var> и <var class="filename">php://temp</var>
    невозможно переиспользовать, поэтому после закрытия потокового ресурса
    нельзя обратиться к потоку повторно.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />file_put_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'php://memory'</span><span style="color: #007700">, </span><span style="color: #DD0000">'PHP'</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'php://memory'</span><span style="color: #007700">); </span><span style="color: #FF8000">// Ничего не выведет<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-6">
   <p><strong>Пример #6 Чтение JSON-данных из тела запроса через обёртку php://input</strong></p>
   <div class="example-contents"><p>
    Пример показывает, как считывать входные данные в формате JSON из тела POST, PUT
    и PATCH-запросов через обёртку <var class="filename">php://input</var>.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$input </span><span style="color: #007700">= </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">"php://input"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$json_array </span><span style="color: #007700">= </span><span style="color: #0000BB">json_decode</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">json</span><span style="color: #007700">: </span><span style="color: #0000BB">$input</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">associative</span><span style="color: #007700">: </span><span style="color: #0000BB">true</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">flags</span><span style="color: #007700">: </span><span style="color: #0000BB">JSON_THROW_ON_ERROR<br /></span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"Поступили JSON-данные: "</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$json_array</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

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