MW211 EXIT

devlog
PHPダウンロード/readfile()の代案のおまけ
2013年09月18日
「readfile()」で大容量ファイルを扱うと以下のエラーがでるといった。
┌──────────────────────────────────────┐
│Fatal error:  Allowed memory size of xxxxxxxxx bytes exhausted              │
│                                   (tried to allocate xxxxxxxxx bytes) in …│
└──────────────────────────────────────┘

これと同じで「fread()」の第二引数で、一回の読み込みサイズを
物凄く大きく指定した場合(ループせずに一回で済まそうとした場合)も、
これと同じエラーとなる。
┌──────────────────────────────────────┐
│@readfile($参照ファイル);                                                   │
├──────────────────────────────────────┤
│$fp = fopen($参照ファイル, 'rb');                                           │
│fread($fp, 大きなサイズ);                                                   │
│fclose($fp);                                                                │
└──────────────────────────────────────┘

つまりまとめて(メモリに)読み込んで一気に提供(標準出力)すると
中間バッファに限界があるが、ループして小出しに提供すれば
中間バッファが小さくても足りるということだ。

【追記】出力バッファリングをオフにすれば「readfile()」が使えると判明
分類:PHP