メニュー 閉じる

[phpMyAdmin]スプリプトがタイムアウトしました。完了させたいのであれば同じファイルを再送信すればインポートが再開されます。

WEB で公開しているWordPress のデータベースをバックアップして、
検証用のローカルWordPress 上にレストアする際、データベースのインポートが失敗する。

ファイルサイズが大きい事が原因と思われる。

スプリプトがタイムアウトしました。
完了させたいのであれば同じファイルを再送信すればインポートが再開されます。

同じファイルを再送信してもインポートが再開されない。

メッセージを鵜呑みにして同じファイルを再度インポートしたところ、さらにエラーで追撃されます。

こんな感じ。

バックアップファイルのサイズが97M 程度あったので、処理に時間がかかるのかな? と思い、
容量が大きめなPOST のテーブルとそれ以外のテーブルで2つに分割してエクスポートし、
それからインポートしてみましたが、結果は変わりませんでした。

メモリの問題らしい ?

ググってみたら、「php.ini」を編集してメモリの上限設定を「128M」にすると良いと書いてあったので、早速確認。

しかし既に、128M (インポートするファイルサイズ以上の値なので、多分問題ないレベルの値)が割り当てられていました。

max_execution_time

その他のリミット設定を探してみたところ、「max_execution_time」が怪しい。
という事で、10倍にしてみました。

; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
;max_execution_time = 30
max_execution_time = 300 ← 変更後

アパッチ再起動。

ブラウザキャッシュクリア。

ダメでした。orz

この後しばらくハマって、やっと分かったのですが、
これが良いところを突いていました。

ハマった内容については割愛しますが、2ページ目に「ハマり道」としてまとめておきます。

実は「phpMyAdmin 」も同じ設定値を持っていた

php.ini の「max_execution_time」同様の設定が、phpMyAdmin にもありました。
「$cfg[‘ExecTimeLimit’] 」と言う設定値で、デフォルト値が「300」。

この値を大きくすると、エラー回避できるという記事をハマり道の果てに見つけました。

$cfg[‘ExecTimeLimit’] の修正方法について。

phpMyAdmin の場合、「config.default.php」にデフォルトの設定値が定義されているようですが、
そのデフォルト値を変更したい場合は、「config.inc.php」に書き込むのが作法の様です。

ファイル名の「inc」はきっと増分って事でしょうね。

つまり、「$cfg[‘ExecTimeLimit’] 」を変更しようと思ったら、

  1. config.default.php から変更したい設定のフレーズをコピー
  2. config.inc.php ファイルに貼り付け
  3. 変更したい値に変更する。

という流れになります。

実際に $cfg[‘ExecTimeLimit’] の値を変更する。

config.default.php をテキストエディタ開いて、
$cfg[‘ExecTimeLimit’] の設定フレーズを(クリップボードに)コピーする。

デフォルト設定はphpMyAdmin インストールフォルダからもう一階層下の 
<phpMyAdmin インストールフォルダ>\libraries\config.default.php
で定義されています。

エディタで config.default.php を開くとこんな感じです。
素敵なアスキーアートがいきなり牙を剥いて来ます。

config.default.php から下記のフレーズをコピーする。

 /**
 * maximum execution time in seconds (0 for no limit)
 *
 * @global integer $cfg['ExecTimeLimit']
 */
$cfg['ExecTimeLimit'] = 300;

config,inc,php ファイルへ貼り付けて値を変更。

ファイルの場所はconfig.default.php から1階層上がったここ。

<phpMyAdmin インストールフォルダ>\config.inc.php

コピーしたフレーズを適当なところに貼りつけたら、値を変更します。
「1800」に設定しました。

 /**
 * maximum execution time in seconds (0 for no limit)
 *
 * @global integer $cfg['ExecTimeLimit']
 */
//$cfg['ExecTimeLimit'] = 300;
$cfg['ExecTimeLimit'] = 1800; ← 変更。

こんな感じ。

注意。
設定値に変な値を入れると、phpMyadmin のGUI が固まるので注意。

「0s」 ってなんや^^;
正しくは「0」です。この些細なミスの為、30 分ほどphpMyAdmin が操作できませんでした。

後は、Apache を再起動して、ブラウザキャッシュをクリアしてから、
エラーが出る97 MB 近いサイズのデータをインポート。

正常に終了しました。

余談

メモリの設定も増やしておこうと思いましたが、
こちらは「無限」に設定されているようなので、このままにしておきます。

/**
 * maximum allocated bytes ('-1' for no limit, '0' for no change)
 * this is a string because '16M' is a valid value; we must put here
 * a string as the default value so that /setup accepts strings
 *
 * @global string $cfg['MemoryLimit']
 */
$cfg['MemoryLimit'] = '-1';

php.ini 無視されている説

2つの設定値の関係が気になるので、検証。
2か所設定しないといけないのか?

php.ini で「max_execution_time」の値をデフォルトの「30」に戻します。

これでインポート出来たら、php.ini は変更しなくてもOK って事ですね。

インポート完了しました。

念のためにphpinfo( ) で設定を確認。
値は「30」で設定どおりに反映されていました。

という事は「max_execution_time = 30」 でインポートが完了しています。

まとめ

インポートのファイルサイズが大きいと、クエリの実行時間が伸びて「タイムアウトエラー」が発生します。

時間制限を増やすには、phpMyAdmin の設定ファイル「config.inc.php」にて、
「$cfg[‘ExecTimeLimit’]」の値を変更します。

2ページ以降に、特に見る必要がない、「ハマった過程など」をまとめました。
一応、ブログのテーマが「ログ」なので。

Posted in WordPress

関連投稿

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です