PHP标准输入?

PHP标准输入?,php,file-io,stdin,Php,File Io,Stdin,我知道PHP通常用于web开发,在web开发中没有标准的输入,但PHP声称,如果您遵循它的时髦的基于web的约定,它可以作为通用脚本语言使用。我知道PHP用print和echo打印到stdout(或者你想叫它什么),这很简单,但我想知道PHP脚本如何从stdin获取输入(特别是fgetc(),但任何输入函数都很好),或者这可能吗?您可以在php://stdin: $f = fopen('php://stdin', 'r'); $ echo 'Hello, World!' | php -r 'e

我知道PHP通常用于web开发,在web开发中没有标准的输入,但PHP声称,如果您遵循它的时髦的基于web的约定,它可以作为通用脚本语言使用。我知道PHP用
print
echo
打印到
stdout
(或者你想叫它什么),这很简单,但我想知道PHP脚本如何从
stdin
获取输入(特别是
fgetc()
,但任何输入函数都很好),或者这可能吗?

您可以在
php://stdin

$f = fopen('php://stdin', 'r');
$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
Hello, World!

通过创建
php://stdin
然后使用
fgets()
读取其中的一行,例如(或者,如您所述,
fgets()
读取单个字符):


IIRC,您也可以使用以下功能:

$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");

从技术上讲是一样的,但语法上更简洁。

从STDIN读取


为了避免乱动文件句柄,请使用
文件获取内容()
php://stdin

$f = fopen('php://stdin', 'r');
$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
Hello, World!
(如果您正在从stdin中读取大量数据,您可能希望使用filehandle方法,但这对许多兆字节都有好处。)

一个简单的方法是

$var = trim(fgets(STDIN));

一炮而过:

$contents = file_get_contents("php://stdin");
echo $contents;
这也适用于:

$data = stream_get_contents(STDIN);

使用fgets时,如果
stdin
未设置或为空(包括在使用
@
时),它可能会在bash脚本中阻塞

例如,将被称为如下:

echo "Hello world" | ./myPHPscript
// Output "Hello world!"
./myPHPscript
// Output "!"

如果您只想读取一行而不需要太多麻烦,请使用内置的readline()函数,而不是手动打开STDIN流:

<?php
$age= readline("Enter your age: ");
echo "Your age is : ".$age;

您也可以使用预定义的常量STDIN,而不是手动打开它:$line=fgets(STDIN);STDIN对我不起作用,但是php://stdin“,”r“做了。在Vista上使用PHP5.2.9-2(cli)(构建时间:2009年4月9日08:23:19)。@EricJ.,奇怪,这是怎么发生的?您是否丢失了
STDIN
?这将在第一行失效。我们也可以使用“$contents=file\u get\u contents(”php://input");`这是目前为止最好的答案。但是为什么要修剪()?修剪空白和新行总是更好,如果不想,可以跳过它指令,值得注意的是,当提供整数时,将
stream\u set\u blocking
的第二个参数设置为
0
将导致错误,因为此函数期望其第二个参数为有效的布尔值。使用
stream\u set\u阻塞(STDIN,false)取而代之。
echo "Hello world" | ./myPHPscript
// Output "Hello world!"
./myPHPscript
// Output "!"
<?php
$age= readline("Enter your age: ");
echo "Your age is : ".$age;