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)
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://stdin");
echo $contents;
Run Code Online (Sandbox Code Playgroud)
IIRC,您也可以使用以下内容:
$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");
Run Code Online (Sandbox Code Playgroud)
技术上相同,但语法更清晰.
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)