2011-05-05 141 views
14

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

$> data | php script.php 

但预期data并未露面。有没有办法做到这一点?

+0

看得那么清楚:检测一个PHP脚本正在运行交互式地或不是](http://stackoverflow.com/q/11327367/367456) – hakre 2015-11-06 11:05:59

回答

17

据我了解,会显示程序的参数,换句话说:

php script.php arg1 arg2 arg3 

但是,如果你管数据到PHP,你将不得不从标准输入读取它。我从来没有试过这个,但我认为它是这样的:

$fp = readfile("php://stdin"); 
// read $fp as if it were a file 
+2

如果你用“file”替换“readfile”,你会得到输入为一行数组,它不会自动回显。 – 2015-06-23 14:01:26

4

你可以管数据,是的。但它不会出现在。它会去标准输入。你可以阅读这几个方面,包括fopen('php://stdin','r')

有很好的例子in the manual

14

如果您data是一个喜欢,你还可以使用该-F或-R标志(-F读取&执行该文件下面呢,-R字面上执行它)如果你使用这些标志已经在管道串会出现在(常规)全局变量$ ARGN

简单的例子:

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

这个工作,你不需要从标准输入读取。我认为这应该被标记。 – Sebastian 2014-07-07 17:19:08

+0

请注意'-R一次**将读取一行**,并执行每行的所有代码。 – Qtax 2017-11-20 12:50:30

0

如果你想让它在显示,试试这个:

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

这将变相任何进入标准输入命令行参数。

4

这为我工作:

stream_get_contents(fopen("php://stdin", "r")); 
25

PHP可以从标准输入读取,并且还为它提供了一个快捷方式:STDIN。

有了它,你可以做这样的事情:

$data = stream_get_contents(STDIN); 

这将只转储所有的管道数据为$的数据。

如果你要开始处理所有数据被读取之前,或输入尺寸太大,无法放入一个变量,你可以使用:

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

STDIN只是$快捷FH = FOPEN (“php:// stdin”,“r”); 相同的方法可以应用于读写文件和tcp流。

3

在这篇文章中,我们看到一个脚本的行为像一个shell脚本,为每行输入执行另一个命令...例如:

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; 
}