php:// - 用于访问各种I/O流
说明:
PHP提供一些杂项I/O流,可支持访问PHP本身的输入和输出流,标准输入,输出和错误文件描述符,内存中和磁盘备份的临时文件流,以及能操作其他文件资源的过滤器。
php://stdin, php://stdout 和 php://stderr
php://stdin,php://stdout和php://stderr支持对PHP进程相应的输入或输出流直接访问。流引用的是一个副本文件描述符,也就是若打开一个php://stdin后再关闭它,关闭的只是一个描述符的拷贝,而实际被STDIN引用的流不会被关闭。这个bug一直持续到PHP5.2.1版。所以建议直接使用常量STDIN,STDOUT和STDERR来操作,而不要去使用这些常量的封装函数来打开流。
php://stdin是只读的,而php://stdout和php://stderr是只写的。
php://input
php://input是一个只读流,支持从请求体(request body)中读出原始raw数据。在POST请求中,最好使用php://input而非$HTTP_RAW_POST_DATA,是因为php://input不依赖于特定的php.ini指令。此外,对那些默认不计算$HTTP_RAW_POST_DATA的情况,激活always_populate_raw_post_data是一种潜在的低内存密集型方案替代。
php://input在enctype="multipart/form-data"中不可用。
注意:
在PHP5.6之前,一个以php://input打开的流只能够被读取一次;而且不支持seek查询操作。但是,根据SAPI实现,也有可能打开另一个php://input流并重启读取操作,这只有当请求体数据被保存过时才有可能。通常这种情况只适用于POST请求,其他请求方式不适用,比如PUT或PROPFIND
php://output
php://output是一个只写流,支持写入output缓冲机制,其方式与print和echo一样。
php://fd
php://fd支持对给定文件描述符的直接访问。比如,php://fd/3指向文件描述符3
php://memory和php://temp
php://memory和php://temp是可读可写流,其支持将临时数据保存进一个类似文件的容器中。这两者的唯一不同是php://memory总是将数据存储进内存中,而php://temp只有当被存储的数据达到一个预定义的阈值(默认为2M)时才会创建一个临时文件。确定该临时文件位置的方法与sys_get_temp_dir()函数一样,
php://temp的内存阈值可通过附加/maxmemory:NN来控制,其中NN表示在需要创建一个文件之前,要保存在内存中的最大数据量,以字节为单位。
php://filter
php://filter是一类元包装,在打开时允许将滤波器应用于流。这对all-in-one函数是很有用的,比如readfile(),file()和file_get_contents()函数,否则,在内容被读取之前是没有机会将过滤器应用于流的。
php://filter目标将下面参数作为它路径的一部分。在一个路径上可指定多个过滤器链,可参考专门使用这些参数的实例。
php://filter 参数
名字 | 描述 |
resource=<需要过滤的流> | 必填,它指定需要过滤的流 |
read=<用于读链的过滤器列表> | 可选,可指定一或多个过滤器名字,以管道字符(/)分割 |
write=<用于写链的过滤器列表> | 可选,可指定一或多个过滤器名字,以管道字符(/)分割 |
<用于读写链的过滤器列表> | 任何不带前缀read=或write=的过滤器列表,都适用于读写链 |
可选的
封装器概要(对php://filter而言,参阅被过滤的封装器概要)
属性 | 支持项 |
受限于allow_url_fopen | No |
受限于allow_url_include | php://input,php://stdin:php://memory和php://temp |
允许读 | php://stdin,php://input.php://fd,php://memory和php://temp |
允许写 | php://stdout,php://stderr,php://output,php://fd,php://memory和php://temp |
允许附加 | php://stdout,php://stderr,php://output,php://fd,php://memory和php://temp(和写一样) |
允许同时读写 | php://fd,php://memory和php://temp |
支持stat() | php://memory和php://temp |
支持unlink() | No |
支持rename() | No |
支持mkdir() | No |
支持rmdir() | No |
支持stream_select() | php://stdin,php://stdout,php://stderr,php://fd和php://temp |
修改记录
版本 | 描述 |
5.6.0 | php://input重新可用 |
5.3.6 | php://fd被添加 |
5.1.0 | php://memory和php://temp被添加 |
5.0.0 | php://filter被添加 |
实例
#1 php://temp/maxmemory
在php://temp创建临时文件前,该可选参数可设置内存阈值
<?php
// Set the limit to 5 MB.
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// Read what we have written.
rewind($fp);
echo stream_get_contents($fp);
?>
#2 php://filter/resource=<stream to be filtered>
该参数必须位于php://filter规范结尾处且要指出想要过滤的流
<?php
/* This is equivalent to simply:
readfile("http://www.example.com");
since no filters are actually specified */
readfile("php://filter/resource=http://www.example.com");
?>
#3 php://filter/read=<filter list to apply to read chain>
该参数接收一或多个过滤器名,以管道字符"/"分隔
<?php
/* This will output the contents of
www.example.com entirely in uppercase */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* This will do the same as above
but will also ROT13 encode it */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
#4 php://filter/write=<filter list to apply to write chain>
该参数接收一或多个过滤器名,以"/"分隔
<?php
/* This will filter the string "Hello World"
through the rot13 filter, then write to
example.txt in the current directory */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
#5 php://memory和php://temp不可重用
php://memory和php://temp不可重用,比如在流关闭过后,就没有办法再去引用它们了。
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // prints nothing
参考
网址