PHP标准输入?

时间:2009-02-16 22:05:15

标签: php file-io stdin

我知道PHP通常用于Web开发,其中 没有标准输入,但PHP声称可以用作通用脚本语言,如果你遵循它的基于网络的时髦约定。我知道PHP使用stdoutprint打印到echo(或任何你想要调用它),这很简单,但我想知道PHP脚本如何输入来自stdin(特别是fgetc(),但任何输入功能都很好),或者这甚至可能吗?

10 个答案:

答案 0 :(得分:69)

可以通过创建stdin的文件句柄来阅读php://stdin,然后以fgets()为例读取一行(或者,如您所说,{对于单个字符{1}}:

fgetc()

答案 1 :(得分:36)

STDIN 中读取recommended way

<?php
while (FALSE !== ($line = fgets(STDIN))) {
   echo $line;
}
?>

答案 2 :(得分:16)

为避免不得不使用文件句柄,请使用file_get_contents()php://stdin

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

(如果你正在从stdin读取真正大量的数据,你可能想要使用文件句柄方法,但这应该对许多兆字节有用。)

答案 3 :(得分:11)

一个简单的方法是

$var = trim(fgets(STDIN));

答案 4 :(得分:8)

您可以在php://stdin上使用fopen()

$f = fopen('php://stdin', 'r');

答案 5 :(得分:6)

一次性抓住这一切:

$contents = file_get_contents("php://stdin");
echo $contents;

答案 6 :(得分:5)

IIRC,您也可以使用以下内容:

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

技术上相同,但语法更清晰。

答案 7 :(得分:2)

这也有效:

$data = stream_get_contents(STDIN);

答案 8 :(得分:2)

使用fgets时,如果stdin未设置或为空,则可能会阻止bash脚本,包括使用@ php error control operator时。

#!/usr/bin/php
<?php
$pipe = @trim(fgets(STDIN));
// Script was called with an empty stdin
// Fail to continue, php warning 

可以通过在php标头上设置stream_set_blocking来避免此行为:

#!/usr/bin/php
<?php
stream_set_blocking(STDIN, 0);
$pipe = @trim(fgets(STDIN));
// Script was called with an empty stdin
// No errors or warnings, continue 
echo $pipe . "!";

例如,被称为如下:

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

答案 9 :(得分:0)

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

self.assertEqual(response['content-type'], 'application/json')

PHP文档是您的朋友: https://www.php.net/manual/en/function.readline.php