如何处理标准输入到标准输出在PHP?

问题描述:

我想写一个简单的PHP脚本,从stdin中获取数据,处理它,然后将其写入stdout。我知道PHP可能不是这种类型的最佳语言,但是我需要现有的功能。如何处理标准输入到标准输出在PHP?

我已经试过

<?php 
$file = file_get_contents("php://stdin", "r"); 
echo $file; 
?> 

,但它不工作。我像这样调用它:echo -e "\ndata\n" | php script.php | cat。并且不会收到错误消息。我正在尝试构建的脚本实际上将成为更大管道的一部分。

任何线索为什么这不起作用? PS:我对PHP不太了解。

如果您是管道系统,您将需要缓冲输入,而不是一次处理所有输入,只需按照* nix工具的标准一次进行一次。

该文件顶部的SheBang允许您直接执行该文件,而不必在命令行中调用php。

保存以下,以test.php的和运行

cat test.php | ./test.php 

看到的结果。

#!php 
<?php 
$handle = fopen('php://stdin', 'r'); 
$count = 0; 
while(!feof($handle)) { 
    $buffer = fgets($handle); 
    echo $count++, ": ", $buffer; 
} 
fclose($handle); 
+0

如果在执行时没有可用的STDIN会怎么样?这不会使脚本挂起吗? – CMCDragonkai 2013-11-15 01:49:41

要放置一个PHP脚本中的管道,你可以使用:

xargs -d "\n" ./mysrcipt.php --foo 

由于许多线/ ARG游戏的./myscript.php将被调用几次,但总是与--foo。

例如为:

./myscript.php: 
#!/bin/php 
<?php 
foreach($args as $key => $value){ 
echo "\n".$key.":".$value; 
} 
?> 
cat -n1000 /path/file | xargs -d "\n" ./myscript.php --foo | less 

将调用脚本两次回声到stdout /更少:

0:./myscript 
1:--foo 
2:[file-line1] 
3:[file-line2] 
... 
800:[file-line799] 
0:./myscript 
1:--foo 
2:[file-line800] 
... 

source

+0

谢谢compie。我不能将xargs的初始流分成两半。 PHP脚本必须具有整个事情。没有诉诸这样的东西,真的没有办法在管道中使用PHP? – brice 2010-07-14 19:11:16

权,得到它的工作。

<?php 
    $input_stream = fopen("php://stdin","r"); 
    $text=""; 
    while($line = fgets($input_stream,4096)){ // Note 4k lines, should be ok for most purposes 
    $text .= $line; 
    } 

    fclose($input_stream); 
    print($text); 
?> 

从食谱PHPBuilder