メモ > サーバ > 各論: トラブル対応例 > PHPでファイルをアップロードできない / タイムアウトする
PHPでファイルをアップロードできない / タイムアウトする
PHPの初期設定では2MBまでしか受け付けない。それ以上のサイズだと、ファイルを選択しなかったときと同じ扱いになる。
php.iniや.htaccessで、upload_max_filesizeとそれに関連する設定を変更する必要がある。
以下は php.ini での、10MBまでのアップロードを受け付けるための設定例。
max_execution_time = 120
memory_limit = 256M
post_max_size = 16M
upload_max_filesize = 10M
以下は .htaccess での、10MBまでのアップロードを受け付けるための設定例。
php_value max_execution_time 120
php_value memory_limit 256M
php_value post_max_size 16M
php_value upload_max_filesize 10M
PHPでファイルアップロードサイズの上限を変更
http://refirio.org/view/347
以下のように、PHPプログラム内で設定を変更することもできる。
ただしpost_max_sizeやupload_max_filesizeは、この方法で変更することはできないので注意。
(memory_limitは変更できるので、部分的な設定は行える。)
ini_set('memory_limit', '256M');
■nginx
Webサーバにnginxを使用している場合、「413 Request Entity Too Large」というエラーになる。
client_max_body_sizeの設定が必要。
# vi /etc/nginx/nginx.conf
Nginx での 413 Request Entity Too Large エラーの対処法 - Qiita
https://qiita.com/takecian/items/639deeae094466de6546
また先の手順で php.ini を編集した後、以下のように php-fpm を再起動する必要がある。
server {
client_max_body_size 256M;
# service nginx reload
# service php-fpm restart
■タイムアウト
PHPのタイムアウト設定は、主に以下を確認する。
# vi /etc/php.ini
Apacheの場合は以下も設定する。
max_input_time = 60 … ユーザからのアップロードを受け付ける秒数。
max_execution_time = 600 … スクリプト実行時間。
# vi /etc/httpd/conf/httpd.conf
PHPでファイルをアップロードするときの設定
http://www.maidsphere.jp/archive/PHP%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%...
nginxの場合は以下も設定する。
Timeout 60 … リクエストを受け取ってから処理完了までの待機時間。
# vi /etc/nginx/nginx.conf
具体例としてphp-fpm+nginxの場合、以下のように設定すればタイムアウトが5分になるはず。(要検証。)
fastcgi_connect_timeout 60;
fastcgi_read_timeout 60;
fastcgi_send_timeout 60;
# vi /etc/nginx/nginx.conf
設定したら、php-fpmとnginxを再起動する。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
keepalive_timeout 315;
# vi /etc/php-fpm.d/www.conf
request_terminate_timeout 300
# systemctl restart php-fpm
# systemctl restart nginx
Nginx+PHP-FPMでタイムアウトを伸ばす - WP Advisor
https://hacknote.jp/archives/2594/
nginx でupstream timed outエラーが発生した時の対処 | レンタルサーバー・自宅サーバー設定・構築のヒント
https://server-setting.info/centos/nginx-upstream-timed-out.html
AWSを使用している場合、ロードバランサーやCloudFrontの設定にも注意。
詳細は AWS.txt の「ロードバランサー」「CloudFront」にある「タイムアウト時間を調整する」を参照。
■データベース
アップロードファイルをデータベースに保存する場合、データベースの設定にも影響を受ける。
サーバのログファイルに
PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 7680 bytes)
というエラーがあったり、アップロード時に画面に
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
と表示されたりする場合、データベースの設定が原因の可能性がある。
MySQLの場合、max_allowed_packetの上限を上げればいい。
通常のMySQLならmy.cnfで設定、RDSならパラメータグループの編集で対応できる。
(パラメータグループの反映にはRDSの再起動が必要と紹介されているが、再起動しなくても反映された。)
インポート時に「MySQL server has gone away」が発生したときの対処
http://company.nankikumano.jp/contents/tech_info/104/
Amazon RDS編〜大きなデータのインポート(MySQL server has gone awayが発生した時)編〜
http://recipe.kc-cloud.jp/archives/3963