php:// 流操作

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缓冲机制,其方式与printecho一样。

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_fopenNo
受限于allow_url_includephp://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.0php://input重新可用
5.3.6php://fd被添加
5.1.0php://memory和php://temp被添加
5.0.0php://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
参考 网址
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值