PHPSpotさんのダウンロードの記事

PHPEditorで有名な(単純に僕が使ってるだけだけど)PHPSpotさんの記事
http://phpspot.org/blog/archives/2008/02/phpdlphp.html

趣旨は、Content-Lengthとかヘッダなんだけど、これをコピーして使おうとすると、大きいファイルだとほとんどの環境では動作しないと思うのでちょっとだけ書き直してみた。

<?php
set_time_limit('-1');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment;filename=test.zip');
header('Content-Length: '.filesize('test.zip'));
readfile('test.zip');
  • max_execution_timeをset_time_limitで変更(これは-1じゃなくて適当な時間かいてもいいかも)
  • echo file_get_contensだと、どう考えてもPHPに一回ずつ大きいファイルの全部読み込むのでreadfileに変更

outputbufferとかそこらへんまで考えるともうちょっと何かが必要かもしれない。

本当にパフォーマンスが必要になったら、mod_xsendfileとか使うといいらしいです。

ちなみにもし、こういう挙動をちゃんとみたかったら、firebugとかで期待する挙動がおこなわれているファイルを実際にダウンロードしてヘッダ眺めると大体わかったりします。

つっこみ歓迎です。

テキストファイルをダウンロードさせるときに、古いIEだとapplication/octet-streamにしないとだめだったのはよい思い出。

>加筆(っていうか一回けしたりしてたんですが)
ファイルサイズが大きいとだめなのは、echo file_get_contensでPHPのmemoly_limitにひっかかるためです。日本語が確実にわるかったのでPHPSpotさんにはご迷惑おかけした次第