phpMyAdmin で 504 Gateway Time-out が出たときの対処法
phpMyAdminからSQLをインポートしようとする際、504 タイムアウトのエラーが出ることがあります。
今回は、その様な場合に何とかphpMyAdminからインポートができる様にしたい人の為の対処法です。
対処法1. ファイルサイズの問題
/etc/php.iniで下記3項目を編集します。
- アップロードできるファイルのサイズの最大値
upload_max_filesize = 512M - POSTすることのできるデータの最大値
post_max_size = 512M - スクリプトが確保できるメモリの最大値
memory_limit = 512M
この時、上記の値が以下の関係であることに注意してください。
upload_max_filesize ≦ post_max_size ≦ memory_limit
php.ini の設定反映は、Webのミドルウェアによって反映方法が違うので注意!
- Apache:再起動すると反映
- nginx:php-fpm の設定の再読み込みすると反映
$ /etc/init.d/php-fpm reload
反映されているかの確認方法
phpMyAdmin のインポートのファイル選択に下記のような記載がされていたらOKです!
(最長: 512MiB)
対処法2. 時間の問題
タイムアウトまでの時間を延ばす対処方法です。
php.ini に max_execution_time という項目があります。この値を変更しましょう。
max_execution_timeは、スクリプトがパーサ(※)に強制終了されるまでの時間を設定しています。
長々としたスクリプトがサーバーへ負荷を与えることを防ぐための設定です。
単位は秒で、0に設定すると制限時間なしになります。
(※パーサ: スクリプトの構文を解析してプログラムが扱うことのできるデータ構造の集合体へ変換するプログラム)参考:
http://php.net/manual/ja/info.configuration.php#ini.max-execution-time
http://e-words.jp/w/%E3%83%91%E3%83%BC%E3%82%B5.html
設定例
※max_execution_timeだけでなく、その他の設定もした方がなお良いと思います。
- php.ini
max_execution_time = 300 - php-fpm.conf
request_terminate_timeout 300 - nginx.conf
fastcgi_read_timeout 300
request_terminate_timeout は単一のリクエストを処理する際のタイムアウトの設定です。この時間を過ぎるとワーカープロセスが kill されます。 このオプションは、'max_execution_time' ini オプションが何らかの理由でスクリプトの実行を止められなかった場合に使われます。 値 '0' は 'Off' を意味します。使用可能な単位: s(秒)(デフォルト), m(分), h(時間) あるいは d(日)、 デフォルト値: 0
参考:
http://php.net/manual/ja/install.fpm.configuration.php#request-terminate-timeoutfastcgi_read_timeout は FastCGIの応答の読み取りタイムアウトを設定します。 それは、nginxへの要求に対して応答を取得するためにどれくらい待つかを決定します。 60(秒)がデフォルト値です。
参考:
http://server-setting.info/centos/nginx-fastcgi-cache.html
設定の反映
Apacheの場合は再起動して設定の反映をさせます。
$ service httpd restart
nginxの場合、設定反映は設定の再読み込みコマンドで反映します。
$ service php-fpm reload $ service nginx reload
ちなみに
この設定をした上で下記エラーが出た際はphpMyAdmin の設定を見直してください。
Maximum execution time of 300 seconds exceeded in ...
phpMyAdmin の設定ファイル(/path/to/phpmyadmin/libraries/config.default.php)の下記の値を変更します。
/** * maximum execution time in seconds (0 for no limit) * * @global integer $cfg['ExecTimeLimit'] */ $cfg['ExecTimeLimit'] = 300;
単位は秒で、0で無制限です。
また、max_execution_time はphpスクリプトの処理時間のみであり、DBアクセスしたときの応答が返るまでの待ち時間は含みません。
回線の速度によるタイムアウトなら、mysql.connect_timeoutを延ばしましょう。
mysql.connect_timeout
接続の有効時間(単位:秒)。Linux では、この有効時間はサーバーからの 最初の応答の待ち時間としても使用されます。
番外
設定を変更せずに、データの変更方法を変えることで可能になる場合です。
データの削除処理は重いらしいので、
大量データを削除する場合は truncate で全削除して、後から必要なデータだけを入れ直した方が早いみたいです。