php://

php://Acceso a distintos flujos de E/S

Descripción

PHP ofrece una serie de flujos de E/S generales que permiten acceder tanto a los flujos de entrada y salida de PHP, a la entrada estándar, a descriptores de ficheros de salida y de errores, a flujos de ficheros temporales en memoria y en disco, y a filtros para poder manipular otros recursos de ficheros según se lee desde o se escribe en ellos.

php://stdin, php://stdout y php://stderr

php://stdin, php://stdout y php://stderr permiten acceder directamente al correspondiente flujo de entrada o salida del proceso de PHP. El flujo hace referencia a un descriptor de fichero duplicado, de modo que si se abre php://stdin y más tarde se cierra, sólo se cerraría la copia del descriptor; el flujo real al que se refiere STDIN no se vería afectado. Tenga en cuenta que PHP mostraba un comportamiento irregular en este aspecto hasta PHP 5.2.1. Se recomienda utilizar simplemente las constantes STDIN, STDOUT y STDERR en lugar de abrir flujos manualmente usando estas envolturas.

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

php://input

php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado. En el caso de peticiones POST, es preferible usar php://input en vez de $HTTP_RAW_POST_DATA ya que no depende de directivas php.ini especiales. Sin embargo, cuando no se genera automáticamente $HTTP_RAW_POST_DATA, se trata de una alternativa que hace un uso menos intensivo de memoria que activando always_populate_raw_post_data. php://input no está disponible con enctype="multipart/form-data".

Nota: Antes de PHP 5.6, un flujo abierto con php://input solamente podía leerse una vez; el flujo no admite operaciones de búsqueda. Sin embargo, dependiendo de la implementación de la SAPI, podría ser posible abrir otro flujo php://input y reiniciar la lectura. Esto solamente es posible si los datos del cuerpo de la petición se han guardado. Este caso es típico en peticiones POST, pero no en otros métodos de petición, como PUT o PROPFIND.

php://output

php://output es un flujo de sólo escritura que permite escribir en el buffer de salida tal como lo hacen print y echo.

php://fd

php://fd permite el acceso directo al descriptor de archivo dado. Por ejemplo, php://fd/3 refiere al descriptor de archivo 3.

php://memory y php://temp

php://memory y php://temp son flujos de lectura-escritura que permiten almacenar datos temporales en una envoltura similar a un fichero. La única diferencia entre las dos es que php://memory siempre almacenará sus datos en memoria, mientras que php://temp utilizará un fichero temporal cuando la cantidad de datos almacenados superen el límite predefinido (por omisión, 2 MB). La ubicación de este fichero temporal está determinada de la misma manera que la funciónsys_get_temp_dir(),

El límite de memoria de php://temp se puede controlar añadiendo /maxmemory:NN, donde NN es la cantidad en bytes máxima de datos a almacenar en memoria antes de recurrir a un fichero temporal.

php://filter

php://filter es una especie de meta-envoltura diseñada para permitir aplicar filtros a los flujos en las aperturas. Esto es muy útil en las funciones todo en uno, como readfile(), file(), y file_get_contents() donde, por otra parte, no se pueden aplicar filtros a los flujos antes de que se lea su contenido.

php://filter acepta los siguientes parámetros como parte de su ruta. Se pueden especifcar múltiples filtros en una ruta. Por favor, consulte los ejemplos para los usos concretors de estos parámetros.

parámetros de php://filter
Nombre Descripción
resource=<flujo a filtrar> Este parámetro es obligatorio. Especifica el flujo que se desea filtrar.
read=<listra de filtros a aplicar a la cadena de lectura> Este parámetro es opcional. Se pueden enumerar uno o más filtros, separados por el carácter |.
write=<lista de filtros a aplicar a la cadena de escritura> Este parámetro es opcional. Se puedene enumerar uno o más filtros, separados por el carácter |.
<lista de filtros a aplicar a las dos cadenas> Cualquier listra de filtros que no esté precedida ni por read= ni por write= se aplicará tanto a las cadenas de lectura como de escritura según proceda.

Opciones

Resumen de la Envoltura (Para php://filter, consúltese el resumen de la envoltura que se filtra)
Atributo Permitido
Restringido por allow_url_fopen No
Restringido por allow_url_include php://input, php://stdin, php://memory y php://temp solamente.
Permite Lecturas php://stdin, php://input, php://fd, php://memory y php://temp solamente.
Permite Escrituras php://stdout, php://stderr, php://output, php://fd, php://memory y php://temp solamente.
Permite Añadir contenidos php://stdout, php://stderr, php://output, php://fd, php://memory y php://temp solamente. (Equivalente a escrituras)
Permite Lecturas y Escrituras Simultáneas php://fd, php://memory y php://temp solamente.
Permite usar la función stat() php://memory y php://temp solamente.
Permite usar la función unlink() No
Permite usar la función rename() No
Permite usar la función mkdir() No
Permite usar la función rmdir() No
Permite usar la función stream_select() php://stdin, php://stdout, php://stderr, php://fd y php://temp solamente.

Historial de cambios

Versión Descripción
5.6.0 php://input se puede reutilzar.
5.3.6 Se añadió php://fd.
5.1.0 Se añadieron php://memory y php://temp.

Ejemplos

Ejemplo #1 php://temp/maxmemory

Este parámetro opcional permite establecer el límite de memoria a partir del cual php://temp comienza a usar un fichero temporal.

<?php
// Establecer el límite a 5 MB.
$fiveMBs 1024 1024;
$fp fopen("php://temp/maxmemory:$fiveMBs"'r+');

fputs($fp"hello\n");

// Leer lo que hemos escrito.
rewind($fp);
echo 
stream_get_contents($fp);
?>

Ejemplo #2 php://filter/resource=<flujo a filtrar>

Este parámetro tiene que ubicarse al final de la especificación de php://filter y tiene que apuntar al flujo que se desea filtrar.

<?php
/* Esto es equivalente a:
  readfile("http://www.example.com");
  dado que no se especifica ningún filtro */

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

Ejemplo #3 php://filter/read=<lista de filtros a aplicar a la cadena de lectura>

Este parámetro contiene uno o más nombres de filtros separados por el caracter |.

<?php
/* Devolverá el contenido de
  www.example.com en mayúsculas */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");

/* Hará lo mismo que el ejemplo de arriba
  pero además lo codificará en ROT13 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>

Ejemplo #4 php://filter/write=<lista de filtros a aplicar a la cadena de escritura>

Este parámetro contiene uno o más nombres de filtros separados por el caracter |.

<?php
/* Filtrará el string "Hello World" con
  el filtro rot13, y después lo escribirá en
  example.txt dentro del directorio actual */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>

Ejemplo #5 php://memory y php://temp no son reutilizables

php://memory y php://temp no son reutilizabes, esto es, debepués de que los flujos hayan sido cerrados, no hay forma de hacer referencia a ellos de nuevo.

file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // no imprime nada