Я пытаюсь написать простой скрипт 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 .