Я знаю, что PHP обычно используется для веб-разработки, где нет стандартного ввода, но PHP утверждает, что он может использоваться в качестве языка сценариев общего назначения, если вы следуете ему в надуманных веб-конвенциях. Я знаю, что PHP печатает на stdout
(или все, что вы хотите называть) с print
и echo
, что достаточно просто, но мне интересно, как PHP скрипт может получить вход от stdin
(особенно с fgetc()
, но любая функция ввода хороша), или это даже возможно?
Стандартный ввод PHP?
Ответ 1
Можно прочитать stdin
, создав дескриптор файла php://stdin
, а затем прочитайте его с помощью fgets()
для строки, например (или, как вы уже сказали, fgetc()
для одного символа ):
<?php
$f = fopen( 'php://stdin', 'r' );
while( $line = fgets( $f ) ) {
echo $line;
}
fclose( $f );
?>
Ответ 2
Чтение из STDIN рекомендуемый способ
<?php
while (FALSE !== ($line = fgets(STDIN))) {
echo $line;
}
?>
Ответ 3
Чтобы не путаться с файловыми дескрипторами, используйте file_get_contents()
и php://stdin
:
$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
Hello, World!
(Если вы читаете поистине огромный объем данных из stdin
, вы можете использовать подход filehandle, но это должно быть хорошо для многих мегабайт.)
Ответ 4
Простым методом является
$var = trim(fgets(STDIN));
Ответ 5
Вы можете использовать fopen()
в php://stdin
:
$f = fopen('php://stdin', 'r');
Ответ 6
Возьмите все за один снимок:
$contents = file_get_contents("php://stdin");
echo $contents;
Ответ 7
IIRC, вы также можете использовать следующее:
$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");
Технически то же самое, но немного чище синтаксически.
Ответ 8
Это также работает:
$data = stream_get_contents(STDIN);
Ответ 9
При использовании 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 "!"