从STDIN逐行阅读

sob*_*3ch 47 php stdin pipe

我想做这样的事情:

$ [mysql query that produces many lines] | php parse_STDIN.php
Run Code Online (Sandbox Code Playgroud)

parse_STDIN.php文件中我希望能够从stdin逐行解析我的数据.

Shi*_*dim 94

使用STDIN常量作为文件处理程序

while($f = fgets(STDIN)){
    echo "line: $f";
}
Run Code Online (Sandbox Code Playgroud)

注意:STDIN上的fgets读取\n字符.

  • 如果其他人像我一样慢慢理解,"STDIN上的fgets读取`\n`字符"意味着"$ f`中的字符串将包含`\n`字符".即换行符包含在`fgets`的返回值中(参见http://php.net/fgets) (2认同)

Lui*_*lón 15

您也可以使用生成器 - 如果您不知道STDIN的大小.

需要PHP 5> = 5.5.0,PHP 7

有点像:

function stdin_stream()
{
    while ($line = fgets(STDIN)) {
        yield $line;
    }
}

foreach (stdin_stream() as $line) {
    // do something with the contents coming in from STDIN
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多关于生成器的信息(或谷歌搜索教程):http: //php.net/manual/en/language.generators.overview.php

  • 由于`fgets()`将换行保持在最后("\n"),因此在EOF之前不会发生. (2认同)
  • 这种实现过于复杂并且是不必要的抽象。无论在 foreach 中完成什么,都可以在 while 循环中简单地完成。 (2认同)