[HTML]
<form action="hoge.php" enctype="multipart/form-data" method="POST">
<input name="hogefile" type="file" />
<input type="submit" value="送信" />
</form>
[/HTML]
PHPを使用して、このような形式でファイルをアップロードする場合、アップロードされるファイルサイズの上限はphp.iniで設定されています。(正確には.htaccessやPHP自身でも設定できますが。)
php.iniには、アップロードファイルの上限を設定する箇所が3つあります。
- memory_limit(使用できるメモリの上限設定)
- post_max_size(POSTされるデータの上限設定)
- upload_max_filesize(アップロードされるファイルサイズの上限設定)
です。
それぞれ
memory_limit >= post_max_size >= upload_max_filesize
という関係になっています。
つまり、「upload_max_filesize」をいくら増やしても、「post_max_size」で設定されているサイズ以上のファイルはアップロードできないし、「post_max_size」を増やしても、「memory_limit」で設定されているサイズ以上のファイルはアップロードできないというわけです。
例:
memory_limit = "128MB"
post_max_size = "512MB"
upload_max_filesize = "1G"
この場合、アップロードできるファイルサイズの上限は128MBとなります。
memory_limit = "128MB"
post_max_size = "1G"
upload_max_filesize = "1G"
この場合でも同様。
もちろん、memory_limitは、サーバのメモリサイズ(仮想メモリ含む)の上限を超えることはできません。
つまり、
memory_limit = "2G"
post_max_size = "2G"
upload_max_filesize = "2G"
こう設定したとしても、実際のサーバのメモリ(+仮想メモリ)が1GB分しかなければ、1GBまでしかアップできないということになります。(他にもメモリ使ってるだろうから実際はもっと低い)
では、サーバのメモリを12GBくらい積んで
memory_limit = "4G"
post_max_size = "4G"
upload_max_filesize = "4G"
とした場合、4GBまでアップロードできるようになるか?
答えはNoです。
この原因は、apacheにあります。
apacheの設定に、「LimitRequestBody」というものがあり、これの上限は2GBとなっています。
「LimitRequestBody」はその名の通り、HTTPリクエストのボディ部分のサイズ限界です。
いくらPHP側の設定で、2GB以上を迎え入れる準備をしたところで、HTTPリクエストの方で限界を迎えるわけです。
まあ、2GB以上をアップすることは中々ないとは思いますが、大容量のファイル共有サイトなどを作ろうと思ったりした場合は、注意が必要ですね。(FTP接続の方式にすればうまくいくかも。)