данные о трубопроводах в командной строке php?

Можно ли передавать данные с помощью unix-труб в скрипт php командной строки? я пробовал

$> data | php script.php 

Но ожидаемые data не отображались в $argv . Есть ли способ сделать это?

Насколько я понимаю, $argv покажет аргументы программы, другими словами:

 php script.php arg1 arg2 arg3 

Но если вы передаете данные в PHP, вам придется читать их со стандартного ввода. Я никогда не пробовал этого, но я думаю, что это что-то вроде этого:

 $fp = readfile("php://stdin"); // read $fp as if it were a file 

PHP может читать со стандартного ввода, а также обеспечивает хороший ярлык для него: STDIN.

С его помощью вы можете делать такие вещи, как:

 $data = stream_get_contents(STDIN); 

Это просто сбрасывает все данные, передаваемые по каналам, в $ data.

Если вы хотите начать обработку до того, как все данные будут прочитаны, или размер ввода слишком велик, чтобы вписаться в переменную, вы можете использовать:

 while(!feof(STDIN)){ $line = fgets(STDIN); } в while(!feof(STDIN)){ $line = fgets(STDIN); } 

STDIN – это просто ярлык $ fh = fopen ("php: // stdin", "r"); Те же методы могут применяться для чтения и записи файлов и потоков tcp.

Если вы на одном подобном, вы также можете использовать флаг -F или -R (-F читает и выполняет файл, следующий за ним, -R выполняет его в буквальном смысле). Если вы используете эти флаги, появится строка, в которую была пропущена строка в (регулярной) глобальной переменной $ argn

Простой пример:

 echo "hello world" | php -R 'echo str_replace("world","stackoverflow", $argn);' 

Да, вы можете передавать данные. Но он не появится в $argv . Он пойдет на stdin. Вы можете прочитать это несколько способов, включая fopen('php://stdin','r')

В руководстве есть хорошие примеры

Это сработало для меня:

 stream_get_contents(fopen("php://stdin", "r")); 

Пришел к этому сообщению, чтобы создать скрипт, который ведет себя как скрипт оболочки, выполняя другую команду для каждой строки ввода … ex:

 ls -ln | awk '{print $9}' 

Если вы хотите создать скрипт php, который ведет себя аналогичным образом, это сработало для меня:

 #!/usr/bin/php <?php $input = stream_get_contents(fopen("php://stdin", "r")); $lines = explode("\n", $input); foreach($lines as $line) { $command = "php next_script.php '" . $line . "'"; $output = shell_exec($command); echo $output; } 

Если вы хотите, чтобы он отображался в $argv , попробуйте следующее:

 echo "Whatever you want" | xargs php script.php 

Это будет скрыто, что входит в стандартный ввод в аргументы командной строки.