<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'wrappers.php.php',
    1 => 'php://',
    2 => 'Acceso a los diversos flujos I/O',
  ),
  'up' => 
  array (
    0 => 'wrappers.php',
    1 => 'Protocolos y Envolturas soportados',
  ),
  'prev' => 
  array (
    0 => 'wrappers.ftp.php',
    1 => 'ftp://',
  ),
  'next' => 
  array (
    0 => 'wrappers.compression.php',
    1 => 'zlib://',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Acceso a los diversos flujos I/O</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-wrappers.php-description">
  <h3 class="title">Descripción</h3>
  <p class="para">
   PHP proporciona un número importante de flujos I/O que permiten acceder
   a los flujos de entrada y salida de PHP mismo, a los descriptores de ficheros
   de entrada, salida y error estándar, a flujos que representan
   ficheros temporales en memoria viva o en disco, así como a filtros
   que pueden manipular otros recursos de ficheros durante la lectura o escritura.
  </p>

  <div class="refsect2 unknown-1" id="wrappers.php.std">
   <h4 class="title">php://stdin, php://stdout y php://stderr</h4>
   <p class="simpara">
    <var class="filename">php://stdin</var>, <var class="filename">php://stdout</var> y
    <var class="filename">php://stderr</var> permiten acceso directo a los flujos de entrada
    o salida correspondientes del proceso PHP. El flujo hace referencia a una copia
    del descriptor de fichero, lo que significa que si se abre <var class="filename">php://stdin</var>
    y se cierra más tarde, solo se cierra la copia del descriptor; el
    flujo realmente referenciado por <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong> no se ve afectado.
    Se recomienda utilizar únicamente las constantes <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> y <strong><code><a href="reserved.constants.php#constant.stderr">STDERR</a></code></strong> en lugar
    de abrir manualmente los flujos utilizando estas envolturas.
   </p>
   <p class="simpara">
    <var class="filename">php://stdin</var> es de solo lectura, mientras que
    <var class="filename">php://stdout</var> y <var class="filename">php://stderr</var> son
    de solo escritura.
   </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> es un flujo de solo lectura que permite
    leer datos sin tratar desde el cuerpo de la petición.
    <var class="filename">php://input</var> no está disponible en las peticiones POST con
    <code class="literal">enctype=&quot;multipart/form-data&quot;</code> si la opción
    <a href="ini.core.php#ini.enable-post-data-reading" class="link">enable_post_data_reading</a>
    está activada.
   </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> es un flujo de solo escritura, que permite escribir
    en el mecanismo de buffer de salida de la misma manera que las funciones
    <span class="function"><a href="function.print.php" class="function">print</a></span> y
    <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> permite acceso directo al descriptor de fichero
    especificado. Por ejemplo, <var class="filename">php://fd/3</var> corresponde al
    descriptor de fichero número 3.
   </p>
  </div>


  <div class="refsect2 unknown-13" id="wrappers.php.memory">
   <h4 class="title">php://memory y php://temp</h4>
   <p class="simpara">
    <var class="filename">php://memory</var> y <var class="filename">php://temp</var>
    son flujos de lectura/escritura que permiten almacenar datos
    temporales en una envoltura de ficheros. Una diferencia entre
    estos dos flujos es que <var class="filename">php://memory</var> almacenará siempre
    sus datos en memoria, mientras que <var class="filename">php://temp</var> utilizará un
    fichero temporal una vez que la cantidad de datos almacenados haya superado
    un límite predefinido (por omisión, 2 Mo). La ubicación
    de este fichero temporal se determina de la misma manera que para
    la función <span class="function"><a href="function.sys-get-temp-dir.php" class="function">sys_get_temp_dir()</a></span>.
   </p>
   <p class="simpara">
    El límite de memoria de <var class="filename">php://temp</var> puede ser controlado
    añadiendo <code class="literal">/maxmemory:NN</code>, donde <code class="literal">NN</code> es
    la cantidad máxima de datos a conservar en memoria antes de utilizar
    un fichero temporal, en bytes.
   </p>
   <div class="caution"><strong class="caution">Precaución</strong>
    <p class="simpara">
     Algunas extensiones PHP pueden requerir un flujo IO estándar,
     y pueden intentar convertir un flujo dado a un flujo IO estándar.
     Esta conversión puede fallar para los flujos de memoria, ya que la función C
     <span class="function"><strong>fopencookie()</strong></span> debe estar disponible.
     Esta función C <em>no está</em> disponible en 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> es una especie de envoltura prevista
    para permitir la aplicación de <a href="filters.php" class="link">filtros</a>
    sobre un flujo en el momento de su apertura. Esto es muy práctico con
    funciones sobre ficheros todas-en-una como las funciones
    <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> y
    <span class="function"><a href="function.file-get-contents.php" class="function">file_get_contents()</a></span>, donde no existe otro mecanismo
    que permita aplicar un filtro al flujo antes de que el contenido sea leído.
   </p>
   <p class="para">
    La meta de <var class="filename">php://filter</var> toma los parámetros siguientes
    bajo la forma de componentes de su ruta. Varios filtros encadenados
    pueden ser especificados en una sola ruta. Consúltese los ejemplos
    para un uso correcto de estos parámetros.
   </p>
   <p class="para">
    <table class="doctable table">
     <caption><strong>Parámetros de php://filter</strong></caption>
     
      <thead>
       <tr>
        <th>Nombre</th>
        <th>Descripción</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td>
         <code class="literal">resource=&lt;flujo a filtrar&gt;</code>
        </td>
        <td>
         Este parámetro es requerido. Especifica el flujo que se desea
         filtrar.
        </td>
       </tr>

       <tr>
        <td>
         <code class="literal">read=&lt;lista de filtros a aplicar a la lectura&gt;</code>
        </td>
        <td>
         Este parámetro es opcional. Uno o más nombres de filtros
         pueden ser proporcionados aquí, separados por un carácter pipe (<code class="literal">|</code>).
        </td>
       </tr>

       <tr>
        <td>
         <code class="literal">write=&lt;lista de filtros a aplicar a la escritura&gt;</code>
        </td>
        <td>
         Este parámetro es opcional. Uno o más nombres de filtros
         pueden ser proporcionados aquí, separados por un carácter pipe (<code class="literal">|</code>).
        </td>
       </tr>

       <tr>
        <td>
         <code class="literal">&lt;lista de filtros a aplicar tanto a la lectura como a la escritura&gt;</code>
        </td>
        <td>
         Todos los filtros proporcionados sin ser prefijados por <code class="literal">read=</code>
         o <code class="literal">write=</code> serán aplicados tanto a la
         lectura como a la escritura.
        </td>
       </tr>

      </tbody>
     
    </table>

   </p>
  </div>

 </div>


 <div class="refsect1 options" id="refsect1-wrappers.php-options">
  <h3 class="title">Opciones</h3>
  <p class="para">
   <table class="doctable table">
    <caption><strong>
     Resumen de la envoltura (para <code class="literal">php://filter</code>, consúltese
     el resumen de la envoltura a filtrar)
    </strong></caption>
    
     <thead>
      <tr>
       <th>Atributo</th>
       <th>Soportado</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>Restringido por <a href="filesystem.configuration.php#ini.allow-url-fopen" class="link">allow_url_fopen</a></td>
       <td>No</td>
      </tr>

      <tr>
       <td>Restringido por <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> y
        <code class="literal">php://temp</code> únicamente.
       </td>
      </tr>

      <tr>
       <td>Permite la lectura</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> y
        <code class="literal">php://temp</code> únicamente.
       </td>
      </tr>

      <tr>
       <td>Permite la escritura</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> y
        <code class="literal">php://temp</code> únicamente.
       </td>
      </tr>

      <tr>
       <td>Permite la adición</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> y
        <code class="literal">php://temp</code> únicamente. (Equivalente a la escritura)
       </td>
      </tr>

      <tr>
       <td>Permite tanto la lectura como la escritura</td>
       <td>
        <code class="literal">php://fd</code>,
        <code class="literal">php://memory</code> y
        <code class="literal">php://temp</code> únicamente.
       </td>
      </tr>

      <tr>
       <td>Soporte de la función <span class="function"><a href="function.stat.php" class="function">stat()</a></span></td>
       <td>
        No. Sin embargo, <code class="literal">php://memory</code> y
        <code class="literal">php://temp</code> soportan <span class="function"><a href="function.fstat.php" class="function">fstat()</a></span>.
       </td>
      </tr>

      <tr>
       <td>Soporte de la función <span class="function"><a href="function.unlink.php" class="function">unlink()</a></span></td>
       <td>No</td>
      </tr>

      <tr>
       <td>Soporte de la función <span class="function"><a href="function.rename.php" class="function">rename()</a></span></td>
       <td>No</td>
      </tr>

      <tr>
       <td>Soporte de la función <span class="function"><a href="function.mkdir.php" class="function">mkdir()</a></span></td>
       <td>No</td>
      </tr>

      <tr>
       <td>Soporte de la función <span class="function"><a href="function.rmdir.php" class="function">rmdir()</a></span></td>
       <td>No</td>
      </tr>

      <tr>
       <td>Soporte de la función <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> y
        <code class="literal">php://temp</code> únicamente.
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>
 </div>
 

 <div class="refsect1 examples" id="refsect1-wrappers.php-examples">
  <h3 class="title">Ejemplos</h3>
  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 php://temp/maxmemory</strong></p>
   <div class="example-contents"><p>
    Este parámetro opcional permite configurar el límite
    de memoria antes de que <var class="filename">php://temp</var> comience a utilizar
    un fichero temporal.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Define el límite a 5 Mo.<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">// Lee lo que acabamos de escribir.<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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-2">
   <p><strong>Ejemplo #2 php://filter/resource=&lt;flujo a filtrar&gt;</strong></p>
   <div class="example-contents"><p>
    Este parámetro debe ser colocado al final de la especificación
    de <var class="filename">php://filter</var> y debe apuntar al flujo
    que se desea filtrar.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/* Esto es equivalente a<br />  readfile("http://www.example.com");<br />  ya que no se especifica ningún filtro */<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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-3">
   <p><strong>Ejemplo #3 php://filter/read=&lt;lista de filtros a aplicar a la lectura&gt;</strong></p>
   <div class="example-contents"><p>
    Este parámetro toma uno o más nombres de filtros separados por
    un carácter pipe <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 /></span><span style="color: #FF8000">/* Esto mostrará el contenido de<br />  www.example.com completamente en mayúsculas */<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">/* Esto hará lo mismo que el anterior,<br />  pero codificará además el resultado en 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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-4">
   <p><strong>Ejemplo #4 php://filter/write=&lt;lista de filtros a aplicar a la escritura&gt;</strong></p>
   <div class="example-contents"><p>
    Este parámetro toma uno o más nombres de filtros separados por
    un carácter pipe <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 /></span><span style="color: #FF8000">/* Esto filtrará la cadena "Hello World"<br />  a través del filtro rot13, y luego escribirá el resultado<br />  en el fichero example.txt del directorio actual */<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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-5">
   <p><strong>Ejemplo #5 php://memory y php://temp no son reutilizables</strong></p>
   <div class="example-contents"><p>
    <var class="filename">php://memory</var> y <var class="filename">php://temp</var>
    no son reutilizables, es decir, después de que los flujos hayan sido cerrados no hay manera de referenciarlos nuevamente.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<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">// no muestra nada</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-6">
   <p><strong>Ejemplo #6 php://input para leer datos JSON del cuerpo de la solicitud</strong></p>
   <div class="example-contents"><p>
    Este ejemplo demuestra cómo leer datos JSON sin procesar de solicitudes POST, PUT y
    PATCH usando <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 />$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 /></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">"Datos JSON recibidos: "</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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

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