PHP 里有一类特殊的协议,叫做 php://,专门用来访问各种输入输出流(I/O streams)。说白了,就是让你能直接跟标准输入、标准输出、临时数据甚至过滤器打交道,而不必真的去操作文件系统。这东西在命令行脚本、Web 请求处理或者流式数据加工时特别有用,值得好好捋一遍。
先看最基本的几个:
- php://stdin — 标准输入流,说白了就是从终端或者管道里读数据,跟 CLI 模式下的
STDIN一个意思。 - php://stdout — 标准输出流,把数据写到命令行终端,等价于
STDOUT。 - php://stderr — 错误描述符,专门用来输出错误信息,不影响 stdout 的正常输出,调试时非常好用。
接下来是跟 HTTP 请求和响应相关的两个流:
- php://input — 这是个只读流,能直接拿到原始 HTTP 请求的 body 数据。比如 POST 过来的 JSON 或 XML,用
file_get_contents('php://input')就能原样读取,比$_POST更灵活。 - php://output — 正好相反,这是个只写流,你往里面写什么,它就会直接发送到响应体中。某些场景下可以用来替代
echo或print,尤其是在需要流式输出大文件时。
还有两个比较底层的:
- php://fd — 允许直接访问指定的文件描述符。比如
php://fd/3就引用了文件描述符 3,这在多进程或 socket 编程中偶尔会用到。
临时数据存储方面,两个长相相似的兄弟:
- php://memory 和 php://temp — 这俩都是类似文件包装器的流,用来读写临时数据。唯一的区别在于:
php://memory始终把数据存在内存里,而php://temp会在数据量达到一定阈值后自动切换到磁盘文件中。简单说,小数据用 memory 快,大数据用 temp 更安全。
最后一个是 php://filter,这货设计出来就是为了在数据流打开时做筛选过滤的。比如你想对文件内容进行 base64 编码、压缩或者字符串转换,都可以用这个流包装器来搞定,非常灵活。
更详细的用法和参数,可以翻翻 PHP 官方手册:https://www.php.net/manual/zh/wrappers.php.php。