2024 年 PHP 大会日本站

php://

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

描述

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

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

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

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() 函数确定临时文件位置的方式相同。

php://temp 的内存限制可以通过附加 /maxmemory:NN 来控制,其中 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
/* 这将过滤字符串“Hello World”
通过 rot13 过滤器,然后写入
当前目录中的 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