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