- 締切済み
PHPによるファイルのダウンロード
初めまして最近ちょっとはまってしまっているので分る方がいましたらアドバイスお願いします。 PHPのheader関数を使ってブラウザのダイアログを表示させるファイルのダウンロードを実装した際に、ファイルサイズが大きいものをダウンロードしているとダウンロードが完了するまで他のアクセスが応答しなくなる場合があります。 基本的には $fp = fopen($filePath, "rb"); $contents = fread($fp, filesize($filePath)); fclose($fp); $len = strlen($contents); header("Content-type: application/octet-stream"); header('Content-disposition: inline; filename="' . $filename . '"'); header("Content-length: " . $len); echo $contents; というような一般的な書き方をしています。 ファイルのサイズ的には10MB前後です。 同じような現象を解決された方がいましたらアドバイス頂けると幸いです。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- x415f484f
- ベストアンサー率71% (57/80)
応答云々と仰るよりも…… > $fp = fopen($filePath, "rb"); > $contents = fread($fp, filesize($filePath)); > fclose($fp); 10MB 前後も一気にバッファへ取り込む方法というのはかなり乱暴なのではないでしょうか? サイズは filesize で取得。 $len = filesize($filePath); ファイルの読み込みと出力。 readfile ($filePath); とされたほうがよろしいのではないでしょうか? readfile の挙動(改行コードに値する箇所のデータ変化)へ対策に fopen を使ってバイナリとして 開いているのだとしても、もう少しバッファを減らされてはどうなのでしょうか? # マシンに高速なハードディスクと膨大なメモリが搭載されているのであれば # アクセス応答の問題が解決されるかどうかはわかりませんが。