2011-12-31 141 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

相關問題