将数据从一个流传输到另一个流

时间:2011-12-31 16:59:35

标签: php

我正在寻找将数据从一个流传输到另一个流的最佳方法,而无需自己处理缓冲。基本上相当于node.js stream.pipe函数。

stream_copy_to_stream,但根据手册页上的评论,这是一个非常大的内存(可能将整个流读入内存?)。

当然我可以这样做:

$fh = fopen('filename.txt', 'rb');
$out = STDOUT;
while (!feof($fh)) {
    $bytes = 1024;
    fwrite(STDOUT, fread($fh, $bytes), $bytes);
}
fclose($fh);

但是我希望有一个更简单的API来完成这个,而不必自己做缓冲。

感谢。

1 个答案:

答案 0 :(得分:4)

我下载了PHP 5.4.0的源代码并查找了stream_copy_to_stream(streams.c第1419行)。在我看来这看起来很合理。

首先,它尝试对源流进行内存映射,并在不使用中间缓冲区的情况下一次性将整个内容写入目标。

如果无法进行内存映射,则它使用内部缓冲区(8192字节,请参见php_streams_int.h第49行中的CHUNK_SIZE)将数据从源缓冲到目的地。

手动注释错误,或者开发人员自首次编写以来已对其进行了改进。我再试一次。