php://input 和 php://stdin 有什么区别
What's the difference between php://input and php://stdin
同样php://output
和php://stdout
有什么区别?
我试图弄清楚服务器如何提供 php://input
和 php://output
。我能想到的唯一方法(根据 this page in the manual,php://input
和 php://output
都独立于神秘的 php.ini 文件)是更改 stdin
和 stdout
都引用连接套接字的文件描述符。但令我懊恼的是,我发现 php://stdin
和 php://stdout
也被定义了——大概是以不同的方式定义的。
这只是冗余还是这些文件名实际上指的是做不同的事情?有人能告诉我这是怎么回事吗?
区别在于您预期使用它们的环境。 php://stdin
、php://stdout
和 php://stderr
直接映射到相关的 POSIX file streams,旨在与 CLI SAPI 一起使用。另一方面,php://input
和 php://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
对于需要将信息、调试或错误消息输出到与程序输出不同的流的命令行程序员来说当然是无价的。
同样php://output
和php://stdout
有什么区别?
我试图弄清楚服务器如何提供 php://input
和 php://output
。我能想到的唯一方法(根据 this page in the manual,php://input
和 php://output
都独立于神秘的 php.ini 文件)是更改 stdin
和 stdout
都引用连接套接字的文件描述符。但令我懊恼的是,我发现 php://stdin
和 php://stdout
也被定义了——大概是以不同的方式定义的。
这只是冗余还是这些文件名实际上指的是做不同的事情?有人能告诉我这是怎么回事吗?
区别在于您预期使用它们的环境。 php://stdin
、php://stdout
和 php://stderr
直接映射到相关的 POSIX file streams,旨在与 CLI SAPI 一起使用。另一方面,php://input
和 php://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
对于需要将信息、调试或错误消息输出到与程序输出不同的流的命令行程序员来说当然是无价的。