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


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

Author: Chris Lutz, 2009-02-17

9 answers

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

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

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

fclose( $f );
?>
 65
Author: Patrick Glandien, 2012-07-28 20:19:14

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

<?php
while (FALSE !== ($line = fgets(STDIN))) {
   echo $line;
}
?>
 36
Author: anatoly techtonik, 2010-12-17 23:22:17

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

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

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

 13
Author: mjs, 2012-02-27 12:09:19

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

$var = trim(fgets(STDIN));
 11
Author: Muhammad Usman, 2013-10-30 02:50:54

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

$f = fopen('php://stdin', 'r');
 8
Author: Greg, 2009-02-16 22:08:07

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

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

Технически то же самое, но немного чище с точки зрения синтаксиса.

 5
Author: Fritz H, 2009-02-16 23:09:29

Захватите все это одним выстрелом:

$contents = file_get_contents("php://stdin");
echo $contents;
 5
Author: redolent, 2014-03-10 21:26:49

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

$data = stream_get_contents(STDIN);
 2
Author: Richard Cross, 2015-08-14 12:58:32

При использовании 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 
 0
Author: Cryptopat, 2018-03-05 11:56:59