php://input 和 php://stdin 有啥区别

Posted

技术标签:

【中文标题】php://input 和 php://stdin 有啥区别【英文标题】:What's the difference between php://input and php://stdinphp://input 和 php://stdin 有什么区别 【发布时间】:2016-03-20 15:07:06 【问题描述】:

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

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

这只是冗余还是这些文件名实际上是指做不同的事情?谁能告诉我这里发生了什么?

【问题讨论】:

php.net/manual/en/wrappers.php.php 你可以在这里阅读所有相关信息,它特别提到了它们之间的区别 @NicRobertson 这实际上与我在问题中引用的页面相同。该页面显示“php://stdinphp://stdoutphp://stderr 允许直接访问 PHP 进程的相应输入或输出流。”然后它说“php://input 是一个只读流,允许您从请求正文中读取原始数据。”这不是和标准输入一样吗?然后更令人困惑的是,该文档说“php://output 是一个只写流,它允许您以与打印和回显相同的方式写入输出缓冲区机制。”这似乎真的意味着标准输出和输出是相同的。 文档中解释的问题应说明不理解的原因/要点。重复文档的答案没有帮助。 @Sven 我认为这不在文档中。 input 和 stdin 都具有相同的权限,并且(在没有缓存的情况下)引用相同的文件描述符。文档中没有介绍它们有何不同。 【参考方案1】:

不同之处在于您需要使用它们的环境。 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 之类的 Web SAPI 使用,并且不会将 STDIN 的内容传递给它。同样,尝试使用 php://stdin 读取原始 POST 数据(php://input 的唯一真正用途)将失败。

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

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

【讨论】:

以上是关于php://input 和 php://stdin 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

php的三种CLI常量:STDIN,STDOUT,STDERR

php的三种CLI常量:STDIN,STDOUT,STDERR

php的三种CLI常量:STDIN,STDOUT,STDERR

php的特殊协议

WinINET 和 PHP php://input POST 读取

PHP filter_input_array() 函数