php_user_filter子类filter方法被调用两次

时间:2017-10-14 05:52:05

标签: php filter stream fread

我完全迷惑为什么filter函数被输入两次:一次是内存流的内容,第二次是什么(因为循环从未进入)。当您确实想要使用流构造来添加和附加引号字符时,它会导致错误。

计划:

<?php
class Trivial extends php_user_filter {
    function filter($in, $out, &$consumed, $closing) {
        print("entering filter:\n");

        while ($bucket = stream_bucket_make_writeable($in)) {
            print("in the loop\n");
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }

        print("returning from filter\n\n");
        return PSFS_PASS_ON;
    }
}

$stream = @fopen("php://temp", 'r+');
fwrite($stream, "Hello", 5);
rewind($stream);
stream_filter_register('trivial', 'Trivial');
stream_filter_append($stream, 'trivial', STREAM_FILTER_READ);
$result = fread($stream, 8192);
print("stream: '" . $result . "'\n");
?>

输出:

entering filter:
in the loop
returning from filter

entering filter:
returning from filter

stream: 'Hello'

编辑在我的Mac笔记本电脑和Ubuntu 16.04 Linux上检查PHP7.02和我的PHP 5.6;这不是bug或版本怪癖。

编辑2 我认为我已经非常接近答案(尽管非常不满意的推断):$closing第一次是falsetrue 1}}第二次。

0 个答案:

没有答案