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

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

$> data | PHP скрипт.php

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

Ответы

Ответ 1

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

PHP скрипт.php arg1 arg2 arg3

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

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

Ответ 2

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

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

$data = stream_get_contents(STDIN);

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

#!/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;
}

Ответ 7

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

echo "Whatever you want" | xargs PHP скрипт.php

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