Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 逐行读取标准数据_Php_Pipe_Stdin - Fatal编程技术网

Php 逐行读取标准数据

Php 逐行读取标准数据,php,pipe,stdin,Php,Pipe,Stdin,我想这样做: $ [mysql query that produces many lines] | php parse_STDIN.php 在parse_STDIN.php文件中,我希望能够从STDIN中逐行解析数据。使用STDIN常量作为文件处理程序 while($f = fgets(STDIN)){ echo "line: $f"; } 注意:STDIN上的fgets读取\n字符。如果不知道STDIN的大小,也可以使用生成器 需要PHP5>=5.5.0,PHP7 大致如下: fu

我想这样做:

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

parse_STDIN.php文件中,我希望能够从STDIN中逐行解析数据。

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

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

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

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

需要PHP5>=5.5.0,PHP7

大致如下:

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

foreach (stdin_stream() as $line) {
    // do something with the contents coming in from STDIN
}
您可以在此处阅读有关生成器的更多信息(或通过谷歌搜索教程):

您是否尝试过从PHP脚本中调用该查询?您知道mysqli_查询(“从
big_table
中选择
many_line
”);?这样,您就不必传递参数或任何东西。PHP是一种用于Web服务器的脚本语言。如果您想要一个真正的处理解决方案,请使用编程语言,如C。首先:为什么?为什么不在PHP脚本中运行查询呢?其次:
while(!feof(STDIN)){$line=fgets(STDIN);do_stuff($line);}
您应该了解PHP手册中的命令行用法部分:@ATaylor,因为我更喜欢PHP,而不是C。如果我更了解PHP,我看不出与C发生冲突的原因。@DaveRandom,因为我想将它用于不同的事情,而不仅仅是用于这个mysql查询。'accept'?你什么意思?应该有[接受]按钮还是什么?对不起,我没有经常使用stackoverflow,所以可能我遗漏了一些东西。这在理论上是不正确的。它不适用于具有空行的输入:
echo-e“one\ntwo\n\n\ntree\n”| php readFromStdin.php
。检查我的编辑。@yourdeveloperfriend你说的
不起作用是什么意思?如果行是空的,它将读取空字符串。如果其他人像我一样理解缓慢,请选中此选项,“STDIN上的fgets读取
\n
字符”表示“
$f
中的字符串将包含
\n
字符”。也就是说,换行符包含在
fgets
的返回值中(请参阅)如果STDIN中的某一行为空或
“0”
?因为
fgets()
将换行符保留在末尾(\n”),这将在EOF之前不会发生。如果(!defined(“STDIN”)define(“STDIN”)define”(“STDIN”),“fopen”(“fopen”),您可以执行
操作php://stdin“,”r')”在较低的php版本上此实现过于复杂且不必要的抽象。在foreach中完成的任何操作都可以简单地在while循环中完成。如果按照编写的方式使用,我同意脚本是不必要的复杂,但是一般来说,将foreach和fgets分离到程序的不同部分可能会有所帮助。例如,它允许编写一个测试,将硬编码的行数组传递给执行foreach检查的函数,以检查它是否返回正确的结果。