我完全迷惑为什么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
第一次是false
而true
1}}第二次。