2009-02-16 7 views
44

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

ответ

64

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

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

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

fclose($f); 
?> 
+21

Вы можете также использовать предопределенный постоянный STDIN, а не открывать его вручную: $ строки = fgets (STDIN); – gix

+2

STDIN не работал для меня, но «php: // stdin», «r». Использование PHP 5.2.9-2 (cli) (построено: 9 апреля 2009 г. 08:23:19) в Vista. –

+0

@EricJ., Странно, как это случилось? Вы 'fclose'' STDIN'? – Pacerier

8

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

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

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

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

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

+1

Это должен быть комментарий –

36

Чтение из STDIN является recommended way

<?php 
while (FALSE !== ($line = fgets(STDIN))) { 
    echo $line; 
} 
?> 
12

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

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

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

+1

'file_get_contents' .... даст такую ​​же огромную проблему, как и огромность файла. – Pacerier

11

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

$var = trim(fgets(STDIN)); 
+2

Также мы можем использовать '$ contents = file_get_contents (" php: // input ");' –

5

захватить все это в одном кадре:

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

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

$data = stream_get_contents(STDIN); 
0

При использовании fgets, он может блокировать в Баш сценариев, если stdin не установлен или не пуст, в том числе при использовании @php error control operator.

#!/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 
Смежные вопросы