2011-12-31 105 views
2

我正在寻找将数据从一个流传输到另一个流的最佳方式,而无需处理缓冲自己。基本上相当于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来实现这一目标,而不必做缓冲自己。

谢谢。

回答

3

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

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

如果内存映射不可行,那么它使用内部缓冲区(8192字节,请参见php_streams_int.h第49行中的CHUNK_SIZE)将数据从源到目标进行混洗。

手动评论是错误的,或者是开发人员自第一次写入以来改进了功能。我会再看一次。

+0

很好的答案,谢谢! – igorw 2012-03-10 12:19:51

相关问题