Php Ftell在对文件指针应用流筛选器时报告意外值

Php Ftell在对文件指针应用流筛选器时报告意外值,php,deflate,ftell,Php,Deflate,Ftell,我试图在应用zlib.deflate流过滤器时,使用ftell计算写入文件的数据。但基于ftell的大小与写入文件的数据的实际大小不同 下面是我的代码 $handler_read = fopen('image.jpg', 'rb'); $handler_write = fopen('image.jpg.z', 'wb'); $stream_filter = stream_filter_append($handler_write, 'zlib.deflate', STREAM_FILTER_WR

我试图在应用
zlib.deflate
流过滤器时,使用
ftell
计算写入文件的数据。但基于
ftell
的大小与写入文件的数据的实际大小不同

下面是我的代码
$handler_read = fopen('image.jpg', 'rb');
$handler_write = fopen('image.jpg.z', 'wb');

$stream_filter = stream_filter_append($handler_write, 'zlib.deflate', STREAM_FILTER_WRITE);

printf("Cursor at: %s%s", ftell($handler_write), PHP_EOL);

$start = ftell($handler_write);
while(!feof($handler_read)) {

    $chunk = fread($handler_read, 1024*512);

    fwrite($handler_write, $chunk);

    printf("Cursor at: %s%s", ftell($handler_write), PHP_EOL);

}
$end = ftell($handler_write);

fclose($handler_read);
fclose($handler_write);

printf("Actual size: %s%s", filesize('image.jpg.z'), PHP_EOL );
printf("Curser based size: %s%s", $end - $start, PHP_EOL);
以下是结果

Cursor at: 0
Cursor at: 463944
Cursor at: 989108
Cursor at: 1055270
Actual size: 1148880
Curser based size: 1055270

如果不添加流过滤器会发生什么?是否有可能它以某种方式进行缓冲并抛出文件指针?没有流筛选器也可以。@ethrbunny我尝试了
fflush
,但没有区别,尽管
fflush
返回true。如果在附加筛选器之前将调用移动到
$start
,会发生什么情况?@ethrbunny没有区别,
$start
在这两种情况下都将为0。