PHP标准输入?

71

我知道PHP通常用于Web开发,因为那里没有标准输入,但PHP声称如果你遵循它的奇特基于Web的惯例,它可作为通用脚本语言使用。我知道PHP使用printechostdout(或你想叫它的任何东西)输出内容,这很简单,但我想知道PHP脚本如何从stdin(具体来说是使用fgetc(),但任何输入函数都可以)获取输入,或者这是否可能?

10个回答

95

通过创建一个文件句柄到php://stdin,然后使用fgets()读取一行(或者如您已经提到的那样,使用fgetc()读取单个字符),可以读取stdin

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

while( $line = fgets( $f ) ) {
  echo $line;
}

fclose( $f );
?>

32
你也可以使用预定义常量STDIN来代替手动打开:$line = fgets(STDIN); - gix
4
标准输入对我来说无法工作,但是 'php://stdin','r' 可以。在 Vista 上使用 PHP 5.2.9-2 (cli) (built: Apr 9 2009 08:23:19)。 - Eric J.
@EricJ.,这很奇怪,那是怎么发生的?你有没有fclose STDIN - Pacerier
6
第一次出现 falsy(假值) 的地方便会退出。 - Allain Lalonde

48

STDIN读取数据是推荐的方式

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

26
为避免繁琐的文件句柄操作,请使用file_get_contents()php://stdin

为避免繁琐的文件句柄操作,请使用file_get_contents()php://stdin

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

如果你需要从标准输入流中读取大量数据,你可能需要使用文件句柄的方法,但对于许多兆字节的数据来说,这种方法就足够了。


那会无限期地阻塞脚本和Web服务器!使用 file_get_contents('php://input') 替代,那个可行。 - ygoe

18
一个简单的方法是:
$var = trim(fgets(STDIN));

2
另外,我们可以使用 $contents = file_get_contents("php://input"); - Bogdan Burym
1
这绝对是最好的答案。 - Theodore R. Smith
为什么要使用trim()函数? - HappyDog
最好修剪空格和换行符,如果不想这样做可以跳过。 - Muhammad Usman
警告:使用未定义的常量STDIN - 假定为'STDIN'(这将在PHP的将来版本中引发错误) - Martin Zvarík
看起来 STDIN 只适用于控制台使用,而不适用于 POST 请求体。 - ygoe

13

一次性获取所有内容:

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

那会无限期地阻塞脚本和Web服务器!使用 file_get_contents('php://input') 替代,那个可行。 - ygoe

8

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

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

6
这也可以起作用:
$data = stream_get_contents(STDIN);

5
使用fgets时,如果stdin未设置或为空,包括在使用@ php错误控制运算符时,在bash脚本中可能会被阻塞。请注意,保留html标签。
#!/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, false);
$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 "!"

1
当使用declare(strict_types=1);指令时,值得注意的是将stream_set_blocking的第二个参数设置为0会导致错误,因为该函数期望其第二个参数为有效的布尔值,而不是整数。应改用stream_set_blocking(STDIN, false); - Amin NAIRI

5
据我所知,您也可以使用以下内容:
$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");

从技术上讲,它们是相同的,但语法更加简洁。


1

如果你只想读取一行而不想费太多力气手动打开STDIN流,请使用内置的readline()函数:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接