php://input 和 php://stdin 有什么区别

What's the difference between php://input and php://stdin

同样php://outputphp://stdout有什么区别?

我试图弄清楚服务器如何提供 php://inputphp://output。我能想到的唯一方法(根据 this page in the manualphp://inputphp://output 都独立于神秘的 php.ini 文件)是更改 stdinstdout 都引用连接套接字的文件描述符。但令我懊恼的是,我发现 php://stdinphp://stdout 也被定义了——大概是以不同的方式定义的。

这只是冗余还是这些文件名实际上指的是做不同的事情?有人能告诉我这是怎么回事吗?

区别在于您预期使用它们的环境。 php://stdinphp://stdoutphp://stderr 直接映射到相关的 POSIX file streams,旨在与 CLI SAPI 一起使用。另一方面,php://inputphp://output 旨在用于基于 Web 的 SAPI。

从命令行尝试运行这两个命令:

printf "foo" | php -r "var_dump(file_get_contents('php://stdin'));"

printf "foo" | php -r "var_dump(file_get_contents('php://input'));"

你会得到这样的输出:

Command line code:1:
string(3) "foo"

Command line code:1:
string(0) ""

因为 php://input 期望被像 CGI 或 mod_php 这样的网络 SAPI 使用,并且不会获得传递给它的 STDIN 的内容。同样,尝试使用 php://stdin 读取原始 POST 数据(php://input 的唯一实际用途)将失败。

php://output 通常可以在两种环境中使用,但很少使用,因为可以简单地 echo 输出。 php://stdout 是命令行代码更合乎逻辑的选择,尽管通常只使用 echo.

更容易

php://stderr 对于需要将信息、调试或错误消息输出到与程序输出不同的流的命令行程序员来说当然是无价的。