2011-12-31 8 views
2

自分でバッファリングすることなく、ストリーム間でデータをパイプする最良の方法を探しています。基本的には、node.js stream.pipeの機能に相当します。1つのストリームから別のストリームへパイプデータ

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

関連する問題