题
我知道PHP通常用于网络的发展,那里有 是 没有标准的输入,但PHP的权利要求可用作一个通用脚本语言,如果你做按照它的时髦的基于网络的公约。我知道,PHP印刷品 stdout
(或者任何你想叫它)与 print
和 echo
, ,这是很简单的,但我想知道如何PHP script可能得到的输入从 stdin
(具体地说与 fgetc()
, 但任何输入功能良好的),或者是这个可能吗?
解决方案
有可能通过创建的文件句柄stdin
,然后从它与php://stdin
读取例如一个线(或,如你已经陈述的,fgets()
的单个字符)来读取fgetc()
:
<?php
$f = fopen( 'php://stdin', 'r' );
while( $line = fgets( $f ) ) {
echo $line;
}
fclose( $f );
?>
其他提示
这的 STDIN 强>是推荐方式 <读/ p>
<?php
while (FALSE !== ($line = fgets(STDIN))) {
echo $line;
}
?>
要避免乱用文件句柄各处,使用file_get_contents()
和php://stdin
:
$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
Hello, World!
(如果你从stdin
读一个真正庞大的数据量,你可能需要使用的文件句柄的方法,但是这应该是好了许多兆字节)。
一个简单的方法是
$var = trim(fgets(STDIN));
可以使用 fopen()
上php://stdin
:
$f = fopen('php://stdin', 'r');
抓住这一切在一杆:
$contents = file_get_contents("php://stdin");
echo $contents;
IIRC,还可以使用以下:
$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");
技术上相同的,但有点更清晰的语法,明智的。
这也适用:
$data = stream_get_contents(STDIN);
当使用fgets,它可以块砸向脚本,如果 stdin
不是设定或空白,包括同时使用 @
php控制操作员的错误.
#!/usr/bin/php
<?php
$pipe = @trim(fgets(STDIN));
// Script was called with an empty stdin
// Fail to continue, php warning
这种行为可以避免设置 stream_set_blocking
在php header:
#!/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 "!"
不隶属于 StackOverflow