メモ > サーバ > 各論: トラブル対応例 > 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
■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の設定も必要
504 Gateway Time-out が出た際は Elastic Load Balancing の設定にも注意しよう - Qiita
https://qiita.com/kotarella1110/items/169ddcef03983f5d64b2
ただしCloudFrontは、タイムアウトを60秒以上にする場合は申請が必要なので注意
いますぐ使う CloudFront - Qiita
https://qiita.com/sasasin/items/0f0ec1a90af6295589f9
ディストリビューションを作成または更新する場合に指定する値 - Amazon CloudFront
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-spe...
■データベース
アップロードファイルをデータベースに保存する場合、データベースの設定にも影響を受ける
サーバのログファイルに
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