我正在寻找将数据从一个流传输到另一个流的最佳方法,而无需自己处理缓冲。基本上相当于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来完成这个,而不必自己做缓冲。
感谢。
答案 0 :(得分:4)
我下载了PHP 5.4.0的源代码并查找了stream_copy_to_stream(streams.c第1419行)。在我看来这看起来很合理。
首先,它尝试对源流进行内存映射,并在不使用中间缓冲区的情况下一次性将整个内容写入目标。
如果无法进行内存映射,则它使用内部缓冲区(8192字节,请参见php_streams_int.h第49行中的CHUNK_SIZE)将数据从源缓冲到目的地。
手动注释错误,或者开发人员自首次编写以来已对其进行了改进。我再试一次。