发布于2026-07-20 阅读(0)
扫一扫,手机访问
PHP 提供了一套挺实用的杂项输入/输出(IO)流,说白了就是让你能直接访问 PHP 进程的输入输出流、标准输入输出和错误描述符,还能操作内存中的临时文件、磁盘备份的临时文件流,以及各种读取写入文件资源的过滤器。这些工具用好了,能省不少事。
这三个流分别对应 PHP 进程的标准输入、标准输出和标准错误。它们允许你直接访问对应的流。这里有个细节需要注意:如果你打开 php://stdin 然后关闭它,实际上关闭的只是一个复制品,真正的 STDIN 常量并不会受影响。不过 PHP 在 5.2.1 之前这方面的行为有不少 bug,所以推荐直接用 STDIN、STDOUT 和 STDERR 常量,比手工打开这些封装器更靠谱。另外,php://stdin 是只读的,php://stdout 和 php://stderr 是只写的。
这个流是用来访问请求原始数据的只读流。在 POST 请求场景下,建议用 php://input 代替 $HTTP_RAW_POST_DATA,因为后者依赖于特定的 php.ini 指令,而且默认情况下 $HTTP_RAW_POST_DATA 并不会填充,如果激活 always_populate_raw_post_data 反而会消耗更多内存。不过要注意:当 enctype="multipart/form-data" 时,php://input 是无效的。
注意:在 PHP 5.6 之前,
php://input打开的数据流只能读取一次,不支持 seek 操作。但有些 SAPI 实现会在数据保存时允许你打开另一个php://input流重新读取,不过这种情况通常只针对 POST 请求,PUT 或 PROPFIND 等其他方式不适用。
这是一个只写的数据流,作用跟 print 和 echo 一样,可以把内容写入到输出缓冲区。说白了,就是让你能通过文件操作的方式往输出里写数据。
这个流允许直接访问指定的文件描述符。比如 php://fd/3 就引用了文件描述符 3。这在一些需要精细控制文件描述符的场景下很有用。
这两个都是类似文件的包装器,用来读写临时数据。区别在于:php://memory 始终把数据存在内存里,而 php://temp 会在内存量达到预定义的限制(默认 2MB)后,自动把数据存入临时文件。临时文件的位置由 sys_get_temp_dir() 决定。另外,php://temp 的内存限制可以通过添加 /maxmemory:NN 来控制,NN 是以字节为单位表示的最大内存量,超了就写临时文件。
这是一种元封装器,专门用来在数据流打开时应用筛选过滤。特别适合那些一体化的文件函数,比如 readfile()、file() 和 file_get_contents(),因为在这些函数中,你无法在读取数据流内容之前先应用其他过滤器。而 php://filter 正好解决了这个问题。
它的路径中需要包含以下参数(可以组合使用):
| 名称 | 描述 |
|---|---|
resource=<要过滤的数据流> | 必须参数,指定你要筛选的数据流。 |
read=<读链的筛选列表> | 可选,可以设定一个或多个过滤器名称,用管道符 | 分隔。 |
write=<写链的筛选列表> | 可选,可以设定一个或多个过滤器名称,用管道符 | 分隔。 |
<两个链的筛选列表> | 任何没有以 read= 或 write= 为前缀的过滤器列表,会视情况应用于读或写链。 |
| 属性 | 支持 |
|---|---|
| 首先于 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 |
Example #1 php://temp/maxmemory
这个可选选项可以设置 php://temp 开始使用临时文件前的最大内存限制。
Example #2 php://filter/resource=<待过滤的数据流>
这个参数必须位于 php://filter 末尾,指向需要过滤的数据流。
Example #3 php://filter/read=<读链需要应用的过滤器列表>
这个参数采用一个或以管道符 | 分隔的多个过滤器名称。
Example #4 php://filter/write=<写链需要应用的过滤器列表>
Example #5 php://output(用来导出 CSV 文件)
function exportCSV($headings=false, $rows=false, $filename=false){
// 确保有数据可导出
if ((!empty($headings)) AND (!empty($rows))){
// 修改文件名
$name = ($filename !== false) ? $filename . ".csv" : "export.csv";
// 设置必要的头信息
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=' . $name);
// 启动输出
$output = fopen('php://output', 'w');
// 写入表头
fputcsv($output, $headings);
// 循环写入数据行
foreach($rows as $row){
fputcsv($output, $row);
}
// 关闭流并退出
exit();
}
// 默认返回失败
return false;
}
exportCSV(array('title1', 'title2', 'title3'), array(array('a', 'b', 'c')));
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8