php:// — 访问各种 I/O 流
PHP 提供了许多杂项 I/O 流,允许访问 PHP 自己的输入和输出流、标准输入、输出和错误文件描述符、内存中和磁盘支持的临时文件流,以及可以操作其他文件资源的过滤器,这些资源在读取和写入时被操作。
php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程的相应输入或输出流。该流引用了一个重复的文件描述符,因此如果您打开 php://stdin 并在稍后关闭它,您只关闭了描述符的副本 - **STDIN
** 引用的实际流不受影响。建议您简单地使用常量 **STDIN
**、**STDOUT
** 和 **STDERR
**,而不是手动使用这些包装器打开流。
php://stdin 是只读的,而 php://stdout 和 php://stderr 是只写的。
php://input 是一个只读流,允许您从请求主体读取原始数据。如果启用了 enable_post_data_reading 选项,则 enctype="multipart/form-data"
的 POST 请求中不可用 php://input。
php://fd 允许直接访问给定的文件描述符。例如,php://fd/3 指的是文件描述符 3。
php://memory 和 php://temp 是读写流,允许将临时数据存储在类似文件的包装器中。两者之间的区别在于,php://memory 始终将其数据存储在内存中,而 php://temp 在存储的数据量达到预定义限制(默认值为 2 MB)时将使用临时文件。此临时文件的位置由 sys_get_temp_dir() 函数以相同的方式确定。
可以通过附加 /maxmemory:NN
来控制 php://temp 的内存限制,其中 NN
是在使用临时文件之前保留在内存中的最大数据量(以字节为单位)。
某些 PHP 扩展可能需要标准 IO 流,并且可能会尝试将给定的流强制转换为标准 IO 流。对于内存流,这种强制转换可能会失败,因为它需要 C fopencookie() 函数可用。此 C 函数在 Windows 上 *不可用*。
php://filter 是一种元包装器,旨在允许在打开时将 过滤器 应用于流。这对于 readfile()、file() 和 file_get_contents() 等一体化文件函数很有用,这些函数在读取内容之前没有机会将过滤器应用于流。
php://filter 目标在路径中接受以下参数。可以在一个路径上指定多个过滤器链。请参考示例以了解使用这些参数的具体方法。
名称 | 描述 |
---|---|
resource=<要过滤的流>
|
此参数是必需的。它指定您要过滤的流。 |
read=<要应用于读取链的过滤器列表>
|
此参数是可选的。可以在这里提供一个或多个过滤器名称,用管道字符 (| ) 分隔。 |
write=<要应用于写入链的过滤器列表>
|
此参数是可选的。可以在这里提供一个或多个过滤器名称,用管道字符 (| ) 分隔。 |
<要应用于两个链的过滤器列表>
|
任何没有以 read= 或 write= 为前缀的过滤器列表将根据需要应用于读取和写入链。 |
示例 #1 php://temp/maxmemory
此可选参数允许在 php://temp 开始使用临时文件之前设置内存限制。
<?php
// 将限制设置为 5 MB。
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// 读取我们写入的内容。
rewind($fp);
echo stream_get_contents($fp);
?>
示例 #2 php://filter/resource=<要过滤的流>
此参数必须位于 php://filter 规范的末尾,并且应该指向您要过滤的流。
<?php
/* 这等同于简单地:
readfile("http://www.example.com");
因为实际上没有指定任何过滤器 */
readfile("php://filter/resource=http://www.example.com");
?>
示例 #3 php://filter/read=<要应用于读取链的过滤器列表>
此参数接受用管道字符 |
分隔的一个或多个过滤器名称。
<?php
/* 这将完全以大写形式输出 www.example.com 的内容 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* 这将与上面相同
但还会对其进行 ROT13 编码 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
示例 #4 php://filter/write=<要应用于写入链的过滤器列表>
此参数接受用管道字符 |
分隔的一个或多个过滤器名称。
<?php
/* 这将通过 rot13 过滤器过滤字符串 "Hello World"
然后写入
当前目录中的 example.txt */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
示例 #5 php://memory 和 php://temp 不可重用
php://memory 和 php://temp 不可重复使用,即在流关闭后,无法再次引用它们。
<?php
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // 不会输出任何内容