Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这两者的区别是什么php://input 及php://stdin_Php_Sockets_Io_Stdout_Stdin - Fatal编程技术网

什么';这两者的区别是什么php://input 及php://stdin

什么';这两者的区别是什么php://input 及php://stdin,php,sockets,io,stdout,stdin,Php,Sockets,Io,Stdout,Stdin,同样地,php://output和php://stdout 我试图弄清楚服务器是如何提供php://input和php://output。我能想到的唯一方法(考虑到php://input和php://output独立于神秘的php.ini文件(根据),将stdin和stdout更改为都引用连接套接字的文件描述符。但令我懊恼的是,我发现php://stdin和php://stdout也有定义——可能是以不同的方式定义的 这只是冗余还是这些文件名实际上是指做不同的事情?有人能告诉我这里发生了什么吗?

同样地,
php://output
php://stdout

我试图弄清楚服务器是如何提供
php://input
php://output
。我能想到的唯一方法(考虑到php://input和
php://output
独立于神秘的php.ini文件(根据),将
stdin
stdout
更改为都引用连接套接字的文件描述符。但令我懊恼的是,我发现
php://stdin
php://stdout
也有定义——可能是以不同的方式定义的


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

不同之处在于您希望使用它们的环境<代码>php://stdin,
php://stdout
php://stderr
直接映射到相关的,并用于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等web SAPI使用,而不会将STDIN的内容传递给它。同样地,尝试读取原始POST数据(只有
php://input
)使用
php://stdin
将失败

php://output
通常可以在两种环境中使用,但很少使用,因为可以简单地
echo
输出<代码>php://stdout是命令行代码更合理的选择,不过通常只使用
echo
更容易


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

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