久しぶりの投稿となります。
株式会社サザンクロスのサイキです。
お客様からWordPressの既存サイトのカスタマイズのご依頼をいただいた際に、弊社端末に環境再現をし、作業を行うことが多々あります。
その際に重宝するのが、「All-in-One WP Migration」!
Aサイトの情報をExportして、Bサイトに簡単にImportが可能です。
ですが、今回POSTで送信できるファイルサイズの制限にかかり困ったので、備忘録も含めて記録を残します。
同じような問題でお困りの方は是非参考にしてください。(正攻法ではないです。)
■問題の発生
いつものように、お客様から受領したバックアップファイルをローカルで立てた新規環境で、Importした際。読み込みが100%から進まず。
Ajaxでデータの送信を行なっているので、裏でなにかエラーになっているだろうと思い、管理ツールから、コンソール及びネットワークを確認。(何かエラーをわかりやすく発砲してくれればいいのに。。。)
すると、「Request Entity Too Large」とのこと。
ん?POSTのファイルサイズが制限を超えている?
アップロードしようとしているファイルは1Gしかないんだけどな。。。
■解決しなかった正攻法
POSのファイル制限なら、.htaccessに定義を入れれば完了かなと思い、以下を記載。
php_value file_uploads On
php_value upload_max_filesize 5000M
php_value post_max_size 5000M
php_value memory_limit 5000M
php_value max_execution_time 3000
php_value max_input_time 3000
ファイルが1Gなので適当に大きい値を設定。
が、問題解決せず。同じエラーが発生する。
調べてみてもnginxの情報は出てくるけど、Apacheの情報はでない。
どうやら。Apacheはデフォルトで無制限なのに対して。nginxはPOSTのファイルサイズの指定がデフォルトでされているのでハマる人が多いらしい。
弊社ではおもにApacheを利用しているので情報が少ない。。。
■というわけで荒治療
調べても答えを出すのに時間がかかりそうだなと感じ、そもそもローカルにファイルを持っているのにajaxを経由してファイルをPOSTして読み込ませる行為が間違っていないか?
POSTなんかしないで、バックアップファイルのパスを直接指定して読み込ませよう。と思いコードを解析。
とりあえず、エラーとなっている箇所のそばにajaxの送信値を設定している箇所があったので管理コンソールでコメントアウト。
これだけではまだ別のエラーが発生。エラーの内容を元にgrepしてみると以下のファイルがエラーを発砲しているらしい。
/wp-content/plugins/all-in-one-wp-migration/lib/vendor/servmask/archiver/class-ai1wm-archiver.php
コンストラクタなので、最初になんかゴニョゴニョやるメソッドの様子。
fopenをしてファイルを開いているので、$file_nameに画面からPOSTされた情報が格納されているっぽい。
ということで、メソッドの最初の方にこの$file_nameを塗りつぶすコードを追加して再実行。
すると無事、画面からわざわざファイルをPOSTせずに、直接ファイルを開いて処理を実行してくれました!
根本原因が解決してないのが気になるところではありますが、サーバー上で大きいファイルをリストアしたい場合にこのやり方重宝できそう。
プラグインは便利だけど、小さなところで躓いて解決できないなんてことないですか?
そんな時は是非、弊社にご依頼ください!
個人/法人かかわらず親身に対応させていただきます!