Forum und email

Secuencias de entrada/salida PHP

  • php://stdin
  • php://stdout
  • php://stderr
  • php://output
  • php://input
  • php://filter (disponible desde PHP 5.0.0)
  • php://memory (disponible desde PHP 5.1.0)
  • php://temp (disponible desde PHP 5.1.0)

php://stdin, php://stdout y php://stderr le ofrecen acceso a las secuencias de entrada o salida correspondientes del proceso PHP. La secuencia hace referencia a un descriptor de archivo duplicado, de modo que si abre php://stdin y luego lo cierra, estará cerrando únicamente su copia del descriptor--la secuencia realmente referenciada por STDIN no es afectada. Note que PHP exhibía un comportamiento incorrecto en este sentido hasta PHP 5.2.1. Es recomendable que simplemente use las constantes STDIN, STDOUT y STDERR en lugar de abrir manualmente las secuencias usando estas envolturas.

php://output le permite escribir sobre el mecanismo de búfer de salida en la misma manera que lo hacen print() y echo().

php://input le permite leer datos POST en su forma primitiva. Es una alternativa que consume menos memoria que $HTTP_RAW_POST_DATA y no requiere de directivas php.ini especiales. php://input no se encuentra disponible con enctype="multipart/form-data".

php://stdin y php://input son de sólo-lectura, mientras que php://stdout, php://stderr y php://output son de sólo-escritura.

php://filter es una especie de meta-envoltura diseñada para permitir el uso de filtros sobre una secuencia al momento de su apertura. Resulta útil con aquellas funciones de archivos todo-en-uno, como readfile(), file(), y file_get_contents() en donde de otro modo no habría forma de aplicar filtros a la secuencia antes de que los contenidos fueran leídos.

El destino php://filter recibe los siguientes 'parámetros' como partes de su 'ruta'.

  • /resource=<secuencia a ser filtrada> (requerido) Este parámetro debe estar ubicado el final de su especificación php://filter y debe apuntar a la secuencia que desea filtrar.

    <?php
    /* Esto es equivalente a simplemente:
       readfile("https://www.example.com");
       ya que no se aplica filtro alguno */

    readfile("php://filter/resource=https://www.example.com");
    ?>

  • /read=<lista de filtros a aplicar a la cadena de lectura> (opcional) Este parámetro toma uno o más nombres de filtros separados por el caracter |.

    <?php
    /* Esto produce como salida el contenido de
       www.example.com enteramente en mayúsculas */
    readfile("php://filter/read=string.toupper/resource=https://www.example.com");

    /* Esto hace lo mismo pero también codifica la salida con ROT13 */
    readfile("php://filter/read=string.toupper|string.rot13/resource=https://www.example.com");
    ?>

  • /write=<lista de filtros a aplicar a la cadena de escritura> (opcional) Este parámetro toma uno o más nombres de filtro separados por el caracter |.

    <?php
    /* Esto filtra la cadena "Hola Mundo" a través del filtro rot13,
       luego escribe al archivo ejemplo.txt en el directorio actual */
    file_put_contents("php://filter/write=string.rot13/resource=ejemplo.txt","Hola Mundo");
    ?>

  • /<lista de filtros a aplicar a ambas cadenas> (opcional) Cualquier lista de filtros que no esté precedida por read= o write= será aplicada tanto a la cadena de lectura como a la de escritura (según sea el caso).

La envoltura php://memory almacena los datos en memoria. php://temp se comporta de forma similar, pero usa un archivo temporal para almacenar los datos cuando se alcanza cierto límite de memoria (el valor predeterminado es 2 MB).

La envoltura php://temp toma los siguientes 'parámetros' como partes de su 'ruta':

  • /maxmemory:<número de bytes> (opcional). Este parámetro permite modificar el valor predeterminado para el límite de memoria (cuando los datos son movido a un archivo temporal).

    <?php
    $cincoMBs 
    1024 1024;
    $da fopen("php://temp/maxmemory:$cincoMBs"'r+');

    fputs($da"hola\n");

    // leer lo que hemos escrito
    rewind($da);
    echo 
    stream_get_contents($da);
    ?>

Resumen de Envoltura (Para php://filter, refiérase al resumen de la envoltura siendo filtrada.)
Atributo Soporte
Restricción por allow_url_fopen No
Restricción por allow_url_include php://input, php://stdin, php://memory y php://temp únicamente.
Permite Lectura php://stdin, php://input, php://memory y php://temp únicamente.
Permite Escritura php://stdout, php://stderr, php://output, php://memory y php://temp únicamente.
Permite Adición php://stdout, php://stderr, php://output, php://memory y php://temp únicamente. (Equivalente a la escritura)
Permite Lectura y Escritura Simultánea php://memory y php://temp únicamente.
Soporte stat() php://memory y php://temp únicamente.
Soporte unlink() No
Soporte rename() No
Soporte mkdir() No
Soporte rmdir() No