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