【问题标题】:Reading line by line from STDIN从 STDIN 逐行读取
【发布时间】:2012-08-11 16:27:32
【问题描述】:

我想做这样的事情:

$ [mysql query that produces many lines] | php parse_STDIN.php

parse_STDIN.php 文件中,我希望能够从标准输入逐行解析我的数据。

【问题讨论】:

  • 您是否尝试过从 PHP 脚本中调用该查询?你知道 mysqli_query("SELECT many_lines FROM big_table"); 吗?这样,您不必传递参数或任何东西。 PHP 是一种用于网络服务器的脚本语言。如果您想要真正的处理解决方案,请使用编程语言,例如 C。
  • 首先:为什么?为什么不在 PHP 脚本中运行查询?其次:while (!feof(STDIN)) { $line = fgets(STDIN); do_stuff($line); }
  • 您应该了解 PHP 手册中的 Commandline Usage 部分:Input/output streams
  • @ATaylor 因为我更喜欢 php 而不是 C。如果我知道更好的 php,我看不到 C 的麻烦。
  • @DaveRandom 因为我想将它用于不同的事情,而不仅仅是这个 mysql 查询..

标签: php pipe stdin


【解决方案1】:

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

while($f = fgets(STDIN)){
    echo "line: $f";
}

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

【讨论】:

  • '接受'?你的意思是。应该有[接受]按钮还是什么?抱歉,我不经常使用 stackoverflow,所以也许我遗漏了一些东西。
  • 这在理论上是不正确的。它不适用于具有空行的输入:echo -e "one\ntwo\n\n\nthree\n" | php readFromStdin.php。检查我的编辑。
  • @yourdeveloperfriend wont't work 是什么意思?如果该行为空,它将读取空字符串。检查这个ideone
  • 如果其他人像我一样理解缓慢,“STDIN 上的 fgets 读取\n 字符”意味着“$f 中的字符串将包含\n 字符”。 IE。换行符包含在来自fgets 的返回值中(参见php.net/fgets
【解决方案2】:

如果您不知道 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
}

您可以在此处阅读有关生成器的更多信息(或在 Google 上搜索教程): http://php.net/manual/en/language.generators.overview.php

【讨论】:

  • 如果 STDIN 中的某些行为空或"0" 怎么办?
  • 由于fgets() 将换行符保留在末尾(“\n”),直到 EOF 才会发生。
  • 你可以在较低的 php 版本上使用 if(!defined("STDIN")) define("STDIN", "fopen('php://stdin','r')");
  • 此实现过于复杂且不必要的抽象。在 foreach 中完成的任何事情都可以在 while 循环中完成。
  • 如果按原样使用,我同意脚本不必要地复杂,但通常将 foreach 和 fgets 分离到程序的单独部分可能会有所帮助。例如,它允许编写一个测试,将硬编码的行数组传递给执行 foreach 以检查它是否返回正确结果的函数。
猜你喜欢
  • 2012-04-09
  • 2011-06-25
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 2018-06-04
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多