web-dev-qa-db-ja.com

PHP標準入力?

私はPHPが通常Web開発に使用されていることを知っていますis標準入力はありませんが、PHPは汎用スクリプト言語として使用可能であると主張しています。従えば、ファンキーなウェブベースの慣習です。 PHPは、stdoutprintを使用してecho(または呼び出したいもの)に出力することを知っています。 m PHPスクリプトがstdinから入力を取得する方法(具体的にはfgetc()を使用しますが、入力関数は適切です)、またはこれも可能ですか?

51
Chris Lutz

php://stdinへのファイルハンドルを作成してstdinを読み取ってから、たとえばfgets()で行を読み取ることができます(または、既に述べたように、fgetc()単一の文字の場合):

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

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

fclose( $f );
?>
71

[〜#〜] stdin [〜#〜]からの読み取りは 推奨方法

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

ファイルハンドルをいじる必要がないようにするには、file_get_contents()php://stdin

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

stdinから本当に大量のデータを読み取る場合は、ファイルハンドルアプローチを使用することもできますが、これは何メガバイトにも適しているはずです。)

17
mjs

簡単な方法は

$var = trim(fgets(STDIN));
12
Muhammad Usman

_php://stdin_で fopen() を使用できます。

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

一発ですべてをつかむ:

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

IIRCでは、次のものも使用できます。

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

技術的には同じですが、構文的には少し簡潔です。

5
Fritz H

Fgetsを使用する場合、@phpエラー制御演算子 の使用中を含め、stdinが設定されていないか空の場合、bashスクリプトでブロックすることがあります。

#!/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 "!"
2
NVRM

これも機能します:

$data = stream_get_contents(STDIN);
2
Richard Cross