将数据管道化到命令行php?

将数据管道化到命令行php?,php,command-line,pipe,Php,Command Line,Pipe,是否可以使用unix管道将数据导入命令行php脚本?我试过了 $> data | php script.php 但是预期的数据没有显示在$argv中。有办法做到这一点吗?据我所知,$argv将显示程序的参数,换句话说: php script.php arg1 arg2 arg3 但如果将数据导入PHP,则必须从标准输入读取数据。我从来没有试过这个,但我觉得是这样的: $fp = readfile("php://stdin"); // read $fp as if it were a f

是否可以使用unix管道将数据导入命令行php脚本?我试过了

$> data | php script.php

但是预期的
数据
没有显示在
$argv
中。有办法做到这一点吗?

据我所知,
$argv
将显示程序的参数,换句话说:

php script.php arg1 arg2 arg3
但如果将数据导入PHP,则必须从标准输入读取数据。我从来没有试过这个,但我觉得是这样的:

$fp = readfile("php://stdin");
// read $fp as if it were a file
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));'

你可以将数据导入,是的。但它不会出现在
$argv
中。它将被送到斯丁。您可以通过多种方式阅读,包括
fopen('php://stdin“,”r“


有一些很好的例子

如果您的
数据
位于一个类似的位置,您也可以使用-F或-R标志(-F读取并执行它后面的文件,-R按字面意思执行),如果您使用这些标志,则已导入的字符串将显示在(常规)全局变量$argn中

简单的例子:

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

如果希望它显示在
$argv
中,请尝试以下操作:

echo "Whatever you want" | xargs php script.php
这会将标准输入中的任何内容转换为命令行参数。

这对我来说很有效:

stream_get_contents(fopen("php://stdin", "r"));
#!/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;
}

PHP可以读取标准输入,还提供了一个很好的快捷方式:

有了它,您可以使用和其他工具来执行以下操作:

$data = stream_get_contents(STDIN);
这只会将所有管道数据转储到
$data

如果要在读取所有数据之前开始处理,或者输入大小太大,无法放入变量,可以使用:

while(!feof(STDIN)){
    $line = fgets(STDIN);
}
STDIN
只是
$fh=fopen(“php://stdin“,“r”)
同样的方法也可以应用于读写文件和tcp流。

在这篇文章中,我们希望创建一个行为类似于shell脚本的脚本,为输入的每一行执行另一个命令。。。例:

ls -ln | awk '{print $9}'
如果您希望生成一个以类似方式运行的php脚本,这对我很有用:

stream_get_contents(fopen("php://stdin", "r"));
#!/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;
}
#/usr/bin/php

最好的选择是使用-r选项并从stdin获取数据。Ie我使用它使用PHP轻松解码JSON。 这样,您就不必创建物理脚本文件

事情是这样的:

$fp = readfile("php://stdin");
// read $fp as if it were a file
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别名中,如ie displayshares(){…}

我需要获取一个CSV文件并将其转换为TSV文件。当然,我可以将文件导入Excel,然后再重新导出,但有趣的是,通过转换器传输数据意味着我可以留在命令行中,轻松完成工作

因此,我的脚本(称为
csv2tsv
)是

#/usr/bin/php

这是可行的,你不需要阅读标准文本。我认为应该对此进行标记。请注意,
-R
将一次读取一行,并为每行执行所有代码。如果将“readfile”替换为“file”,则输入将作为一个行数组,并且不会自动回显。另请参阅: