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

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

9 ответов

Решение

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

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

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

fclose( $f );
?>

Чтение из STDIN рекомендуется

<?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));

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

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

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

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

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

$data = stream_get_contents(STDIN);

При использовании 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 

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

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

Технически то же самое, но немного чище по синтаксису.

Вместо того, чтобы вручную открывать поток STDIN, используйте встроенную функцию readline(), если вы просто хотите прочитать одну строку без особых хлопот:

<?php
$age= readline("Enter your age: ");
echo "Your age is : ".$age;

Документация PHP - ваш друг: https://www.php.net/manual/en/function.readline.php

Другие вопросы по тегам