php://

php://访问各种 I/O 流

描述

PHP 提供了许多杂项 I/O 流,允许访问 PHP 自己的输入和输出流、标准输入、输出和错误文件描述符、内存中和磁盘支持的临时文件流,以及可以操作其他文件资源的过滤器,这些资源在读取和写入时被操作。

php://stdin、php://stdout 和 php://stderr

php://stdinphp://stdoutphp://stderr 允许直接访问 PHP 进程的相应输入或输出流。该流引用了一个重复的文件描述符,因此如果您打开 php://stdin 并在稍后关闭它,您只关闭了描述符的副本 - **STDIN** 引用的实际流不受影响。建议您简单地使用常量 **STDIN**、**STDOUT** 和 **STDERR**,而不是手动使用这些包装器打开流。

php://stdin 是只读的,而 php://stdoutphp://stderr 是只写的。

php://input

php://input 是一个只读流,允许您从请求主体读取原始数据。如果启用了 enable_post_data_reading 选项,则 enctype="multipart/form-data" 的 POST 请求中不可用 php://input

php://output

php://output 是一个只写流,允许您以与 printecho 相同的方式写入输出缓冲机制。

php://fd

php://fd 允许直接访问给定的文件描述符。例如,php://fd/3 指的是文件描述符 3。

php://memory 和 php://temp

php://memoryphp://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

php://filter 是一种元包装器,旨在允许在打开时将 过滤器 应用于流。这对于 readfile()file()file_get_contents() 等一体化文件函数很有用,这些函数在读取内容之前没有机会将过滤器应用于流。

php://filter 目标在路径中接受以下参数。可以在一个路径上指定多个过滤器链。请参考示例以了解使用这些参数的具体方法。

php://filter 参数
名称 描述
resource=<要过滤的流> 此参数是必需的。它指定您要过滤的流。
read=<要应用于读取链的过滤器列表> 此参数是可选的。可以在这里提供一个或多个过滤器名称,用管道字符 (|) 分隔。
write=<要应用于写入链的过滤器列表> 此参数是可选的。可以在这里提供一个或多个过滤器名称,用管道字符 (|) 分隔。
<要应用于两个链的过滤器列表> 任何没有以 read=write= 为前缀的过滤器列表将根据需要应用于读取和写入链。

选项

包装器摘要(对于 php://filter,请参阅正在过滤的包装器的摘要)
属性 支持
allow_url_fopen 限制
allow_url_include 限制 php://inputphp://stdinphp://memoryphp://temp 仅限。
允许读取 php://stdinphp://inputphp://fdphp://memoryphp://temp 仅限。
允许写入 php://stdoutphp://stderrphp://outputphp://fdphp://memoryphp://temp 仅限。
允许追加 php://stdoutphp://stderrphp://outputphp://fdphp://memoryphp://temp 仅限。(等同于写入)
允许同时读取和写入 php://fdphp://memoryphp://temp 仅限。
支持 stat() 否。但是,php://memoryphp://temp 支持 fstat()
支持 unlink()
支持 rename()
支持 mkdir()
支持 rmdir()
支持 stream_select() php://stdinphp://stdoutphp://stderrphp://fdphp://temp 仅限。

示例

示例 #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://memoryphp://temp 不可重复使用,即在流关闭后,无法再次引用它们。

<?php
file_put_contents
('php://memory', 'PHP');
echo
file_get_contents('php://memory'); // 不会输出任何内容
添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top