передача данных в командную строку php? - PullRequest
20 голосов
/ 05 мая 2011

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

$> data | php script.php

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

Ответы [ 8 ]

33 голосов
/ 08 ноября 2013

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

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

$data = stream_get_contents(STDIN);

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

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

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

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

21 голосов
/ 05 мая 2011

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

php script.php arg1 arg2 arg3

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

$fp = readfile("php://stdin");
// read $fp as if it were a file
16 голосов
/ 09 февраля 2012

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

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

echo "hello world" | php -R 'echo str_replace("world","stackoverflow", $argn);'
4 голосов
/ 08 мая 2012

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

stream_get_contents(fopen("php://stdin", "r"));
4 голосов
/ 05 мая 2011

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

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

3 голосов
/ 19 августа 2015

Наткнулся на этот пост, пытаясь создать сценарий, который ведет себя как сценарий оболочки, выполняя другую команду для каждой строки ввода ... например:

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;
}
1 голос
/ 09 февраля 2012

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

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

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

0 голосов
/ 29 октября 2018

Лучшим вариантом является использование опции -r и получение данных из стандартного ввода. Т.е. я использую его для легкого декодирования JSON с использованием PHP. Таким образом, вам не нужно создавать физический файл сценария.

Это выглядит так:

docker inspect $1|php -r '$a=json_decode(stream_get_contents(STDIN),true);echo str_replace(["Array",":"],["Shares","  -->  "],print_r($a[0]["HostConfig"]["Binds"],true));'

Этот фрагмент кода отобразит общие папки между хостом и контейнером. Пожалуйста, замените $ 1 именем контейнера или поместите его в псевдоним bash, например, displayhares () {...}

...