如何在php中处理stdin到stdout?

时间:2010-07-14 18:52:21

标签: php stdout stdin

我正在尝试编写一个简单的PHP脚本来接收来自stdin的数据,处理它,然后将其写入stdout。我知道PHP可能不是这类东西的最佳语言,但我需要现有的功能。

我试过

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

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

有关为什么不起作用的任何线索?

PS:我对PHP不是很有经验。

3 个答案:

答案 0 :(得分:6)

如果你是管道,你需要缓冲输入,而不是一次处理所有输入,只需按照* 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);

答案 1 :(得分:3)

要将php脚本放在管道中,您可以使用:

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

对于许多行/ args,./myscript.php将被调用几次,但始终使用--foo。

e.g:

./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

将使用echo调用脚本两次到stdout / less:

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

source

答案 2 :(得分:0)

是的,让它运转起来。

<?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的食谱。