背景
PHP×nginxの案件でファイルをうまくアップロードできないことがあり、アップロードする際に許容上限に引っかかっていることが判明。
PHPとnginxの設定をそれぞれ変更してあげる必要があったので、その手順を記載。
PHPの設定を変更
PHPの設定を確認
まずはphpinfo()でPHPの設定を確認。
以下内容のファイルをブラウザで表示できる任意のディレクトリ下に設置して、PHPの設定を確認。
<?php
phpinfo();
phpinfoが開かれたら、下記5項目の設定値を確認。
①file_uploads
ファイルのアップロードの有効/無効(※Onで有効)
②max_file_uploads
一度にアップロードできるファイル総数
③memory_limit
メモリ上限
④post_max_size
一度にアップロードできるファイル合計サイズ
⑤upload_max_filesize
1ファイルの容量上限
※それぞれの詳細な説明はPHPマニュアルで確認をお願いします。
PHPの設定を変更
今回はupload_max_filesize
(1ファイルの容量上限)の設定が原因だったのでここの値を変更。(※デバック方法は最後の補足に記載してます。)
今回はphp.iniを直接編集して設定を変更。
upload_max_filesize = 8M
ここで注意なのが、公式マニュアルに下記のようなメッセージがあるので要チェック。
・一般的に memory_limit は、 post_max_sizeよりも大きくする必要があります。
・post_max_size には、 upload_max_filesizeより大きな値を指定しなければいけません。
つまり、
memory_limit > post_max_size > upload_max_filesize
の関係になるように値設定が必要。
PHPの設定を反映
php.iniを変更した後は、設定を反映させるためにphp-fpmを再起動。
sudo systemctl restart php-fpm
php-fpmを再起動後、phpinfoで変更した値が反映されていればOK。
nginxの設定を変更
PHPの設定を変更して、いざアップロード!
しかし未だにアップロードがうまくできず、、、
調べた結果、nginxの設定も変更が必要みたい。
nginxで許容するアップロードサイズ
nginx公式によると、 nginx ではデフォルトで1MBまでのファイルしか受け付けない設定になっているよう。
nginx で1MBより大きなファイルをアップロードできるようにするには、 confファイルに client_max_body_size ディレクティブを設定。
server {
listen 80;
server_name localhost;
client_max_body_size 8M;
location / {
・・・
nginxの設定を反映
confファイルを変更した後は、設定を反映させるためにnginxを再起動。
再起動する前に記述に誤りがないか確認。
設定ファイルに問題がなければ、以下のように表示されます。
nginx -t
> nginx: the configuration file /etc/nginx/hoge.conf syntax is ok
> nginx: configuration file /etc/nginx/hoge.conf test is successful
設定ファイルに問題がなければnginxを再起動。
sudo systemctl restart nginx
これで無事にアップロードできるようになった…!
補足
今回の記事の内容とは逸れるので、最後にファイルアップロード時のデバックについて記載。
ファイルのアップロードに失敗した際、PHP側でエラーコードが返されるので、それを参考にすると原因が分かりやすい。
今回、$_FILE
の値をみるとこうなってた。
Array
(
[0] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 2
[size] =>
)
)
公式マニュアルより、エラー番号2(アップロードしたファイルがMAX_FILE_SIZE を超えている)が返ってきているので、
アップロードしようとしたファイルサイズが設定値を超えていることが判明しました。