Как обрабатывать stdin для stdout в php?

Я пытаюсь написать простой скрипт php, чтобы взять данные из stdin , обработать его, а затем записать его в stdout . Я знаю, что PHP, вероятно, не лучший язык для такого рода вещей, но есть существующая функциональность, которая мне нужна.

я пробовал

 <?php $file = file_get_contents("php://stdin", "r"); echo $file; ?> 

но это не сработает. Я вызываю его так: echo -e "\ndata\n" | php script.php | cat echo -e "\ndata\n" | php script.php | cat echo -e "\ndata\n" | php script.php | cat . и не получают сообщений об ошибках. Сценарий, который я пытаюсь создать, на самом деле будет частью более крупного конвейера.

Какие-нибудь подсказки, почему это не работает?

PS: Я не очень разбираюсь в PHP.

Если вы используете конвейер, вам нужно будет буферизировать входные данные, а не обрабатывать их все сразу, просто перейдите по одной строке за раз, как это стандартно для инструментов * nix.

SheBang поверх файла позволяет вам напрямую запускать файл, вместо того, чтобы вызывать php в командной строке.

Сохраните следующее для test.php и запустите

 cat test.php | ./test.php 

чтобы увидеть результаты.

 #!php <?php $handle = fopen('php://stdin', 'r'); $count = 0; while(!feof($handle)) { $buffer = fgets($handle); echo $count++, ": ", $buffer; } fclose($handle); 

Чтобы поместить php-скрипт в канал, вы можете использовать:

 xargs -d "\n" ./mysrcipt.php --foo 

Со многими строками / args ./myscript.php будет называться пару раз, но всегда с –foo.

например:

 ./myscript.php: #!/bin/php <?php foreach($args as $key => $value){ echo "\n".$key.":".$value; } ?> cat -n1000 /path/file | xargs -d "\n" ./myscript.php --foo | less 

вызовет сценарий два раза с эхом в stdout / less:

 0:./myscript 1:--foo 2:[file-line1] 3:[file-line2] ... 800:[file-line799] 0:./myscript 1:--foo 2:[file-line800] ... 

источник

Правильно, он работал.

 <?php $input_stream = fopen("php://stdin","r"); $text=""; while($line = fgets($input_stream,4096)){ // Note 4k lines, should be ok for most purposes $text .= $line; } fclose($input_stream); print($text); ?> 

из рецепта на PHPBuilder .