Можно ли передавать данные с помощью 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
Это будет скрыто, что входит в стандартный ввод в аргументы командной строки.