OpenUploadというPHPで書かれたオープンソースのアップローダ/ダウンローダアプリがあります。
これである程度大きなファイルをダウンロードしようとすると、メモリが確保出来ずにダウンロード出来ない、という問題を相談されました。
すでにphp.ini等でmemory_limitの指定は大きくしてあるものの、いくら指定を大きくしても一定以上のメモリは確保できないという状況でした。
調べてみると
lib/modules/default/files.inc.php
の400行くらいにあるreadfileでメモリが足らなくなっており、その手前で
ob_end_clean();
しているところがあるのですが、どうもそこでバッファがクリアしきれてない感じでした。
なので、この行を
while (ob_end_clean());
としてクリアしきるまで回してやることで改善出来ました。
が、これはこれで気持ち悪い。
色々探した所、このへんが同様の問題のようでした。
Open Upload / Bugs / #73 Extremely slow downloads of large files
http://sourceforge.net/p/openupload/bugs/73/?limit=50
そこでphp.iniに
output_buffering=Off
してやることでも解決出来ました。
同様に www の下の .htaccess に
php_value output_buffering "Off"
を追加してやっても良いと思います。