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() 函数确定临时文件位置的方式相同。
php://temp 的内存限制可以通过附加 /maxmemory:NN
来控制,其中 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
/* 这将过滤字符串“Hello World”
通过 rot13 过滤器,然后写入
当前目录中的 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'); // 不打印任何内容