管道数据到命令行php?

use*_*841 21 php command-line pipe

可以使用unix管道将数据传输到命令行php脚本中吗?我试过了

$> data | php script.php
Run Code Online (Sandbox Code Playgroud)

但预期data没有出现在$argv.有没有办法做到这一点?

小智 36

PHP可以从标准输入读取,也为它提供了一个很好的快捷方式:STDIN.

有了它,你可以做以下事情:

$data = stream_get_contents(STDIN);
Run Code Online (Sandbox Code Playgroud)

这只会将所有管道数据转储到$ data中.

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

while(!feof(STDIN)){
    $line = fgets(STDIN);
}
Run Code Online (Sandbox Code Playgroud)

STDIN只是$ fh = fopen("php:// stdin","r")的快捷方式; 可以将相同的方法应用于读取和写入文件以及tcp流.

  • 问题是如果没有数据通过管道传输,它会提示输入数据 (2认同)

Gus*_*son 21

据我了解,$argv将显示该程序的参数,换句话说:

php script.php arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

但是如果将数据传输到PHP中,则必须从标准输入中读取它.我从来没有试过这个,但我认为它是这样的:

$fp = readfile("php://stdin");
// read $fp as if it were a file
Run Code Online (Sandbox Code Playgroud)

  • 如果将"readfile"替换为"file",您将获得输入为行数组,并且不会自动回显. (3认同)

小智 17

如果你data是一个喜欢的,你也可以使用-F或-R标志(-F读取并执行它后面的文件,-R按字面顺序执行)如果你使用这些标志,那么管道输入的字符串将会出现在(常规)全局变量$ argn中

简单的例子:

echo "hello world" | php -R 'echo str_replace("world","stackoverflow", $argn);'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`-R`将一次读取**一行**,并执行每行的所有代码. (2认同)