phpの大容量ファイルアップロード(リクエスト)のサイズ最大値の制限解除

無断転載禁止 phpの大容量ファイルアップロード(リクエスト)のサイズ最大値の制限解除

PHPで大容量ファイルを扱う際の制限変更

どこにでもあるphpのリクエストの最大値変更設定ですが、毎回忘れてしまうので、メモ。

PHPのサイズ最大値変更の項目

phpで大容量ファイルのアップロードを行う際に変更するのは以下の3つ。

memory_limit PHPが使用するメモリーの最大値
post_max_size POSTされるリクエストの最大値
upload_max_filesize アップロードするファイルの最大値

PHPのサイズ最大値変更時の注意点

気を付ける点として
memory_limit > post_max_size > upload_max_filesize
で設定すること。

post_max_size POSTデータに許可される最大サイズを設定します。この設定は、ファ イルアップロードにも影響します。大きなファイルをアップロード するには、この値を upload_max_filesize より大きく設定する必要があります。 一般的に memory_limit は、 post_max_sizeよりも大きく する必要があります。
引用元:PHP Manual

PHPサイズ最大値変更する際の変更方法

今回はPHPでファイルアップロード時に最大32Mまでアップできるように変更。
memory_limitとpost_max_sizeは適宜変更する。

PHP全体で常に変更する場合

常にPHPで同設定を変更する場合
/etc/php.iniに以下を追加

memory_limit = 128M
post_max_size = 64M
upload_max_filesize = 32M

Apache経由で変更する場合

apache経由で同設定を変更する場合
/etc/httpd/conf/httpd.confに以下を追加

<Directory "対象ディレクトリー">
php_value memory_limit 128M
php_value post_max_size 64M
php_value upload_max_filesize 32M
</Directory>

PHPの特定処理で変更する場合

php処理内で特定の処理のときのみ、同設定を変更する場合
対象処理に以下を追加

<?php
ini_set('memory_limit', '128M');
ini_set('post_max_size', '64M');
ini_set('upload_max_filesize', '32M');

Apacheで制限がかかっている場合

上記でもリクエストが処理できない場合は、apache側で制限がかかっている場合があり。
レンタルサーバーなどでは可能性があります。
その場合は
/etc/httpd/conf/httpd.confに以下を追加。レンタルサーバーなので書き込みできない場合は.htaccessファイルへ記述。

LimitRequestBody 0

パケットの送られてくる最大間隔なので、ファイルのアップロード時間が長いだけであれば基本的には問題なし。

サイズ最大値変更以外でアップできない場合。処理時間の変更

大容量ファイルを扱えたとしてもファイルアップロードするリクエスト時間が長くなるため、付随してPHPの実行時間も長くしておく場合もある。
単位は秒。

PHP全体で常に変更する場合

/etc/php.iniに以下を追加

max_execution_time = 60

Apache経由で変更する場合

/etc/httpd/conf/httpd.confに以下を追加

php_value max_execution_time 60

PHPの特定処理で変更する場合

対象処理に以下を追加

<?php
ini_set("max_execution_time",60);
または
set_time_limit(60);

max_input_time については諸説あるようでバージョンによって、設定を行ってください。

Apacheで制限がかかっている場合

アップ自体ができても、次の動作がエラーになる場合。
/etc/httpd/conf/http.confに以下を追加
単位は秒。デフォルトは300秒。

Timeout 300

PHPのサイズ最大値変更のデフォルト値と制限解除

ざっと記述しましたが、PHPのマニュアルにもファイルアップロード時の留意点が書かれています。
PHP Manual「ファイルアップロードの処理」
http://php.net/manual/ja/features.file-upload.common-pitfalls.php

ファイルアップロード制限変更時の各設定項目の一覧。

設定対象 パラメータ名 デフォルト値 無制限
PHP memory_limit 128M -1
PHP post_max_size 8M 0
ただしPHP5.3.4からコンテンツタイプが application/x-www-form-urlencoded であったり、あるいは PHP に登録されていないものであった場合は、 post_max_size = 0 にしても上限を無効にできなくなりました。
PHP upload_max_filesize 2M 不明
PHP max_execution_time 30 -1
Apache LimitRequestBody 0
32ビットのapacheでは基本2GB
0
Apache Timeout 300 0

最後に

やみくもに制限だけアップしていくとセキュリティやディスク容量など周辺環境にも手を加えることがあります。本当に変更が必要な設定なのか、他で回避ができないのか、など判断してから設定することをお勧めします。