php://
php:// — Acceso a distintos flujos de E/S
Descripción
php://stdin, php://stdout y php://stderr permiten acceder directamente al flujo correspondiente 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 en versiones de PHP anteriores a la 5.2.1, se presenta un comportamiento irregular. Se recomienda utilizar las constantes STDIN, STDOUT y STDERR en lugar de abrir flujos manualmente usando estas envolturas.
php://output permite escribir en el buffer de salida de la misma manera que lo harían print() y echo().
php://input permite leer datos a partir del cuerpo solicitado. En el caso de peticiones POST, es preferible a $HTTP_RAW_POST_DATA ya que no depende de diretivas 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".
Note: Los flujos que se abren con php://input sólo pueden leerse una vez; no hay soporte para operaciones de búsqueda. Pero, dependiendo de la SAPI, podría ser posible abrir otro flujo php://input para reiniciar la lectura. Esto sólo es posible si los datos 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 por ejemplo PUT o PROPFIND.
php://stdin y php://input son de solo lectura, mientras que php://stdout, php://stderr y php://output son de sólo escritura.
php://fd permite el acceso directo al descriptor de archivo dado. Por ejemplo, php://fd/3 refiere al descriptor de archivo 3.
php://filter es una especie de meta-envoltura diseñada para permitir el filtrado de 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 tiene los siguientes 'parámetros' incorporados en su 'ruta'.
Opciones
- 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://fd (available since PHP 5.3.6)
Ejemplos
Example #1 /resource=<flujo a filtrar> (obligatorio)
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");
?>
Example #2 /read=<lista de filtros de lectura para aplicar en cadena> (opcional)
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");
?>
Example #3 /write=<lista de filtros de escritura para aplicar en cadena> (opcional)
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");
?>
/<lista de filtros para aplicar en ambas direcciones> (opcional) Todos los filtros que no estén precedidos ni por read= ni por write= se aplicarán tanto en las lecturas como en las escrituras.
La envoltura php://memory almacena los datos en memoria. php://temp se comporta de una forma parecida, pero en su lugar, utiliza un fichero temporal para almacenar los datos una vez que se supera un determinado umbral de memoria (por omisión es 2 MB).
La envoltura php://temp acepta los siguientes 'parámetros' como parte de su 'ruta':
Example #4 /maxmemory:<número de bytes> (opcional)
Permite cambiar el valor por omisión del límite de memoria (cuándo se mueven los datos a un fichero temporal).
<?php
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// leemos lo que hemos escrito
rewind($fp);
echo stream_get_contents($fp);
?>
