ファイルのダウンロードのメモリ消費を減らす†
- ページ: BugTrack
- 投稿者: 鈴木孝征
- 優先順位: 低
- 状態: 完了
- カテゴリー: プラグイン
- 投稿日: 2005-05-21 (土) 15:38:30
- バージョン: 1.4.5
- リリース予定バージョン: 1.5.2
メッセージ†
VineLinux3.1をOSにしてpukiwikiを使用しています。
添付書類(PDFファイル7MB)のダウンロードがうまくできなくて、エラーを見てみたらメモリが使い果たされてしまっていました。
vineの設定ではphp.iniにoutput_handler=mb_output_handlerがセットしてあって、送信されるファイルサイズの3倍ぐらいのメモリが使われてしまうようです。
この問題を解決するためにattachプラグインのreadfile関数を実行する前にob_end_flush()を入れてもらえないでしょうか。
私の環境ではこれでメモリ消費の問題は解決できました。
- 別の視点からのメモ。PHP の設定"output_buffering" が有効になっている場合で、何らかのデータ*1が出力待ちになっている状態だと、header がまだ出力されていないので、pkwk_common_headers() からチェック用関数pkwk_headers_sent() が呼ばれても当然スルーして、出力待ちデータとファイルのデータを合体させたものを出力してしまいます。チェックさえ終わってしまえば問題ない事なんですが。
ちなみに、「pkwk_common_headers() の手前でob_end_flush() をエラー制御付きで呼んだ場合、BugTrack/738 が正常に動くのか」などは試してません。 --
- 関連?: official:質問箱4/448 --
- ふむ、この提案は完全ではありません(困った人向けのhackになっているかもしれませんが、一般解になっていません。)。通常必要が無いob_end_flush()をコールする必要がある環境かどうか(をチェックする方法があるのかどうか、それをどう実装すべきか)検討が無いからです。マニュアル ob_end_flush() と、その User Contributed Notes 欄も参考にして下さい。-- henoheno
- BugTrack/2102 の対応で出力バッファリングをOFFにしましたのでこちらもResolveします。HTMLを返すような通常のPHP動作ではoutput_bufferingは有効ですが、ファイル送信のようなケースでは意図的にこのレイヤのバッファリングをスキップするのはそれほどおかしくない対応だと思います -- umorigu