PHP标准输入?

Chr*_*utz 53 php file-io stdin

我知道PHP通常用于web开发,那里没有标准的输入,但是PHP声称是可用作通用脚本语言,如果你不遵循这是时髦的基于web的约定.我知道PHP打印到stdout(或者你想要调用的任何东西)printecho,这很简单,但我想知道PHP脚本如何从中获取输入stdin(特别是fgetc(),但任何输入函数都是好的),或者是这甚至可能吗?

Pat*_*ien 74

可以stdin通过创建文件句柄来php://stdin读取,然后从中读取fgets()一行(例如,如您所说,fgetc()对于单个字符):

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

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

fclose( $f );
?>
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用预定义的常量STDIN而不是手动打开它:$ line = fgets(STDIN); (26认同)
  • STDIN对我不起作用,但'php:// stdin','r'确实如此.在Vista上使用PHP 5.2.9-2(cli)(内置:2009年4月9日08:23:19). (3认同)
  • 这在第一条假线上保释. (3认同)

ana*_*nik 40

从阅读STDIN推荐的方式

<?php
while (FALSE !== ($line = fgets(STDIN))) {
   echo $line;
}
?>
Run Code Online (Sandbox Code Playgroud)


mjs*_*mjs 17

为了避免乱丢文件句柄,请使用file_get_contents()php://stdin:

$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
Hello, World!
Run Code Online (Sandbox Code Playgroud)

(如果您正在从中读取真正大量的数据,stdin可能需要使用文件句柄方法,但这应该适用于许多兆字节.)


Muh*_*man 12

一个简单的方法是

$var = trim(fgets(STDIN));
Run Code Online (Sandbox Code Playgroud)

  • 我们也可以使用`$ contents = file_get_contents("php:// input");` (2认同)

Gre*_*reg 7

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

$f = fopen('php://stdin', 'r');
Run Code Online (Sandbox Code Playgroud)


red*_*ent 7

一次抓住一切:

$contents = file_get_contents("php://stdin");
echo $contents;
Run Code Online (Sandbox Code Playgroud)


Fri*_*z H 5

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

$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");
Run Code Online (Sandbox Code Playgroud)

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


小智 5

这也有效:

$data = stream_get_contents(STDIN);
Run Code Online (Sandbox Code Playgroud)


NVR*_*VRM 5

stdin使用 fgets 时,如果未设置或为空,则可能会在 bash 脚本中阻塞,包括在使用@ php 错误控制运算符时。

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

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

#!/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 . "!";
Run Code Online (Sandbox Code Playgroud)

例如,调用方式如下:

echo "Hello world" | ./myPHPscript
// Output "Hello world!"
./myPHPscript
// Output "!"
Run Code Online (Sandbox Code Playgroud)