代码之家  ›  专栏  ›  技术社区  ›  brice

如何在php中处理stdin到stdout?

  •  4
  • brice  · 技术社区  · 14 年前

    我正在尝试编写一个简单的php脚本,从中接收数据 stdin stdout

    我试过了

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

    echo -e "\ndata\n" | php script.php | cat . 没有错误信息。我试图构建的脚本实际上是一个更大管道的一部分。

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

    3 回复  |  直到 8 年前
        1
  •  6
  •   tylermac    14 年前

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

    文件顶部的SheBang允许您直接执行文件,而不必在命令行中调用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);
    
        2
  •  3
  •   compie Artelius    14 年前

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

    xargs -d "\n" ./mysrcipt.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
    

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

    source

        3
  •  0
  •   brice    14 年前

    好的,开始工作了。

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