Стандартный ввод PHP? - PullRequest
       8

Стандартный ввод PHP?

48 голосов
/ 17 февраля 2009

Я знаю, что PHP обычно используется для веб-разработки, где - это стандартного ввода, но PHP заявляет, что его можно использовать как язык сценариев общего назначения, если вы действительно следуете его фанки веб-соглашения , Я знаю, что PHP печатает в stdout (или как вы хотите это называть) с print и echo, что достаточно просто, но мне интересно, как PHP-скрипт может получить ввод из stdin (в частности, с fgetc(), но любая функция ввода хороша), или это вообще возможно?

Ответы [ 9 ]

69 голосов
/ 17 февраля 2009

Можно прочитать stdin, создав дескриптор файла для php://stdin, а затем прочитать его с помощью fgets() для строки, например (или, как вы уже сказали, fgetc() для одного символа ):

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

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

fclose( $f );
?>
36 голосов
/ 18 декабря 2010

Чтение из STDIN является рекомендуемым способом

<?php
while (FALSE !== ($line = fgets(STDIN))) {
   echo $line;
}
?>
16 голосов
/ 27 февраля 2012

Чтобы не связываться с файловыми дескрипторами, используйте file_get_contents() и php://stdin:

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

(Если вы читаете действительно огромное количество данных из stdin, вы можете использовать подход с файловым дескриптором, но это должно быть хорошо для многих мегабайт.)

11 голосов
/ 26 марта 2012

Простой метод

$var = trim(fgets(STDIN));
8 голосов
/ 17 февраля 2009

Вы можете использовать fopen() на php://stdin:

$f = fopen('php://stdin', 'r');
6 голосов
/ 11 марта 2014

Хватай все за один выстрел:

$contents = file_get_contents("php://stdin");
echo $contents;
5 голосов
/ 17 февраля 2009

IIRC, вы также можете использовать следующее:

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

Технически то же самое, но с немного более чистым синтаксисом.

2 голосов
/ 05 марта 2018

При использовании fgets может блокировать скрипты bash, если 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:

#!/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 голосов
/ 14 августа 2015

Это также работает:

$data = stream_get_contents(STDIN);
...