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("http://www.example.com");
ya que no se aplica filtro alguno */
readfile("php://filter/resource=http://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=http://www.example.com");
/* Esto hace lo mismo pero también codifica la salida con ROT13 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://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");
?>
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 = 5 * 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);
?>
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 |