Стандартный ввод 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
Возможно, вы захотите использовать файловый дескриптор, но это должно быть хорошо для многих мегабайт.)
Хватай все это одним выстрелом:
$contents = file_get_contents("php://stdin");
echo $contents;
Ты можешь использовать fopen()
на php://stdin
:
$f = fopen('php://stdin', 'r');
При использовании 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