php:// — Acceso a distintos flujos de E/S
PHP ofrece una serie de flujos de E/S generales que permite 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 o se escribe en ellos.
php://stdin, php://stdout y
php://stderr permiten acceder directamente al correspondiente
flujo de entrada o salida del proceso 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 referencia 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 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 es un flujo de sólo escritura que permite escribir en el buffer de salida tal como lo hacen print y echo.
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 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 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.
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. |
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. |
5.0.0 | Se añadió php://filter. |
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 = 5 * 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