php:// input和php:// stdin之间的区别是什么?

时间:2015-12-15 00:02:44

标签: php sockets io stdout stdin

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

我试图弄清楚服务器如何提供php://inputphp://output。我能想到的唯一方法(假设php://inputphp://output都独立于this page in the manual的神秘php.ini文件)将改变stdin和{ {1}}都指向连接套接字的文件描述符。但令我懊恼的是,我发现stdoutphp://stdin也被定义了 - 大概是以不同的方式。

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

1 个答案:

答案 0 :(得分:5)

不同之处在于您期望使用它们的环境。 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://input读取原始POST数据(php://stdin的唯一实际用途)会失败。

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

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