商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > php 流

php 流

  发布于2026-07-20 阅读(0)

扫一扫,手机访问

php:// — 访问各个输入/输出流(I/O streams)

PHP 提供了一套挺实用的杂项输入/输出(IO)流,说白了就是让你能直接访问 PHP 进程的输入输出流、标准输入输出和错误描述符,还能操作内存中的临时文件、磁盘备份的临时文件流,以及各种读取写入文件资源的过滤器。这些工具用好了,能省不少事。

php://stdin, php://stdout 和 php://stderr

这三个流分别对应 PHP 进程的标准输入、标准输出和标准错误。它们允许你直接访问对应的流。这里有个细节需要注意:如果你打开 php://stdin 然后关闭它,实际上关闭的只是一个复制品,真正的 STDIN 常量并不会受影响。不过 PHP 在 5.2.1 之前这方面的行为有不少 bug,所以推荐直接用 STDINSTDOUTSTDERR 常量,比手工打开这些封装器更靠谱。另外,php://stdin 是只读的,php://stdoutphp://stderr 是只写的。

php://input

这个流是用来访问请求原始数据的只读流。在 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 等其他方式不适用。

php://output

这是一个只写的数据流,作用跟 printecho 一样,可以把内容写入到输出缓冲区。说白了,就是让你能通过文件操作的方式往输出里写数据。

php://fd

这个流允许直接访问指定的文件描述符。比如 php://fd/3 就引用了文件描述符 3。这在一些需要精细控制文件描述符的场景下很有用。

php://memory 和 php://temp

这两个都是类似文件的包装器,用来读写临时数据。区别在于:php://memory 始终把数据存在内存里,而 php://temp 会在内存量达到预定义的限制(默认 2MB)后,自动把数据存入临时文件。临时文件的位置由 sys_get_temp_dir() 决定。另外,php://temp 的内存限制可以通过添加 /maxmemory:NN 来控制,NN 是以字节为单位表示的最大内存量,超了就写临时文件。

php://filter

这是一种元封装器,专门用来在数据流打开时应用筛选过滤。特别适合那些一体化的文件函数,比如 readfile()file()file_get_contents(),因为在这些函数中,你无法在读取数据流内容之前先应用其他过滤器。而 php://filter 正好解决了这个问题。

它的路径中需要包含以下参数(可以组合使用):

php://filter 参数
名称描述
resource=<要过滤的数据流>必须参数,指定你要筛选的数据流。
read=<读链的筛选列表>可选,可以设定一个或多个过滤器名称,用管道符 | 分隔。
write=<写链的筛选列表>可选,可以设定一个或多个过滤器名称,用管道符 | 分隔。
<两个链的筛选列表>任何没有以 read=write= 为前缀的过滤器列表,会视情况应用于读或写链。

可选项

封装协议摘要(针对 php://filter,参考被筛选的封装器)
属性支持
首先于 allow_url_fopenNo
首先于 allow_url_includephp://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
支持 unlink()No
支持 rename()No
支持 mkdir()No
支持 rmdir()No
仅仅支持 stream_select()php://stdinphp://stdoutphp://stderrphp://fdphp://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')));
本文转载于:https://blog.csdn.net/anbingmeng1565/article/details/102249982 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注