如何对PHP的标准输出数据进行流过滤?

时间:2011-03-06 12:35:15

标签: php filtering outputstream

是否可以以类似流的方式过滤PHP标准输出的数据:

standard output  ⟶  output filter  ⟶  standard output

我已经知道ob_start了。但我不想一次处理整个输出,而是使用php_user_filter或类似的东西以流式方式处理。

2 个答案:

答案 0 :(得分:3)

我不太明白这是为了什么,但是没有理由不发表答案。

您可以使用ob_start()回调并让其处理部分内容。您只需在初始化后立即设置ob_implicit_flush()即可。现在通常回调是​​一个简单的输入输出功能,但你可以根据需要使它变得复杂:

class ob_callback {
    function __invoke($part, $end_flag_0x04) {
        return "+$part";
        // or map to $stream->filter($in, $out, &$consumed, $closing)
    }
    function __destruct() { /* cleanup */ }
}

ob_start(new ob_callback, 2);
ob_implicit_flush(TRUE);

我不确定流使用的是什么样的。但我认为没有其他方法可以拦截PHP标准输出。请注意,隐式刷新在CLI上不起作用。

答案 1 :(得分:0)

如果我正确理解了您的问题,您可以使用ob_start()$chunk_size的第二个参数。

ob_start('my_callback', 1024);

每次输出导致缓冲区达到或超过一千字节时,上面的示例都会调用my_callback()。如果您在单独的语句中吐出几千字节,my_callback()将被触发多次。如果您输出几千字节作为单个字符串,这将没有用,因为每个输出最多只能触发一次my_callback()