MW211 EXIT

devlog
PHPダウンロード/readfile()の代案
2013年09月17日
「readfile()」は「fread()」(のループ)で代替することができる。

以下のような感じとなる。
┌──────────────────────────────────────┐
│@readfile($参照ファイル);                                                   │
├──────────────────────────────────────┤
│set_time_limit(0);                                                          │
│$fp = fopen($参照ファイル, 'rb');                                           │
│while (!feof($fp)) {                                                        │
│    echo fread($fp, 8192);                                                  │
│}                                                                           │
│fclose($fp);                                                                │
└──────────────────────────────────────┘
「readfile()」はあまり気にすることない、PHP処理時間上限ってのに注意。

つまり、PHP処理時間上限ってのを
「php.ini」の「max_execution_time」(既定値30秒)で定義しているわけだが、
この処理時間がこれを超えると強制的に打ち切られてしまう。

大容量のダウンロードを行った場合、時間がかかると
強制的に打ち切られて、中途半端なダウンロードファイルが提供されてしまうのだ。

ということで、その設定を変えるか、その代案として
先頭で「set_time_limit(0)」実行し、一時的にこれを無制限にするかする必要がある。

ま、そもそもはそんな長時間かけてダウンロードするような設計は避けた方がよい
ということなのだろうけど、必要に直面した場合には
(「fread()」による代案も含め)このような回避方法があるということだ。


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