MW211 EXIT

devlog
PHPダウンロード/readfile()は大きなファイルには使えない
2013年09月16日
便利な「readfile()」だが、大容量のファイルをダウンロードする場合に、
使えないという弱点がある。。
もし、これを行った場合、以下のようなエラーがダウンロードされる。
┌──────────────────────────────────────┐
│Fatal error:  Allowed memory size of xxxxxxxxx bytes exhausted              │
│                                   (tried to allocate xxxxxxxxx bytes) in …│
└──────────────────────────────────────┘
但し、一般的には「@readfile()」のように「@」を付けて
エラーメッセージを抑止しているので空のファイルがダウンロードされるだろう。
この場合は「@」を外してもう一度実行してみるとよい。

で、この原因なのだが、「readfile()」はダウンロードファイルを
一旦すべてメモリ上に展開してしまうため、
大容量ファイルだとメモリが足りなくなってしまうのだ。

使えるメモリは「php.ini」の「memory_limit」で定義しているので
この値を大きくすれば対応できる場合もあるが、物理的にメモリが限られているので、
この範囲内でしか調整ができない。
#もちろんPHP内の他でもメモリは消費されるので、ダウンロードファイルの
  サイズぎりぎりってわけにはいかない(大きめにとらなければならない)

ということで、代案が必要だが、次回。

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