all-in-one-migration を作ってみる | 止まらないバックアップリカバリープラグインの自作
この書き込みは、all-in-one-migration の真似をしてワードプレスを引っ越しさせるプラグインを作ろうという企画です。
出来上がったプラグインだけ欲しい方は
こちらから→wp_migration_yuzu
ごめん、この決めつけはマイブームwww
でも all-in-one-migration でバックアップ取ってたけどリカバリーできない!って、リカバリー中に止まりますというのはよく相談される。
バックアップの時に php のバージョンを合わせることと pluginを全部止めるってしておけば、大抵は問題なくリカバリーできます。
でも、よくわからない(多いのは独立したWEBデザイナーさん)方が
「なんかバックアップできるみたいだからいれてバックアップしてる。」
とか、
「やっぱバックアップは自動でやってほしい。このプラグインだと”できそうだから”」
とか、やっちゃってるんですよね。
いや、自分で使うツールなんだから最低でもリカバリーテストぐらいやりなさいよ。なんですけどね。
all-in-one-migration ならまだしも、ほかのバックアップツールの多くは有料にしないとリカバリーできないから。
all-in-one-migration は、まだ敷居が低いし無料でもなんとかできる(私は)
でも実際問題起っちゃうんですわ。
そうなったら今のところお手上げ。メタデータをバックアップしてきて復旧するしかない。
せめてプラグインの有効化フラグを倒せたら即メタでのリカバリーしなくていいんですけどね。
all-in-one-migration の中を探ってみたけど、単にDBリカバリーしてるだけでいちいち見てない。
ので、自作しようと。
折角なら、自作工程を書き残しておこうと。
all-in-one-migrationが、こうなればいいなぁと思ってるあなたの参考になれば。
この二つを手元に保存するのがワードプレスのバックアップであり、その手元に保管したデータでワードプレスを再生するののがリカバリーです。
スクリプトはFTPでダウンロードします。
スクリプトには、ワードプレス本体と後から追加するデータ(メディア、テーマ、プラグイン)の2つがあります。
前者は、ワードプレスの公式サイトからもってくればいいので必ずしもバックアップする必要はありません。
後者の中のテーマ、プラグインもサイトから持ってくるなり、自身で保管しているでしょうからこれも必須ではありません。
ですが、メディア(画像、PDF 等)は、wp-content/upload/の保管されており、そのファイルはフォルダーとファイル名で、データベースのテーブルに結びつけられています。
そのためアップロード先のフォルダーとファイルの関係性が保たれていないといけないため、wp-content/uploads/ のフォルダーごとバックアップする必要があります。
まとめると、
具体的なバックアップの方法は、こちらに記載してあります。
→ ワードプレスのバックアップを手動で行う方法(プラグインを使わないバックアップ)
具体的なリカバリーの方法は、こちらに記載してあります。
→ ワードプレスのリカバリーを手動で行う方法(プラグインを使わないリカバリー)
でもデータ処理の柔軟性とサーバーの差異を吸収することを考えると mysqldump を使うのが一番楽なようです。
詳しくは、こちらから→PHPでのデータベーステーブルのSQL保存方法
再帰呼び出しをつかってフォルダーの中のフォルダーを追いかける形で処理します。
詳しくは、こちらから→PHPでのフォルダーごと複写する方法
ですが、ZipArchiveは、サーバーによってはインストールされていないことがあります。
そういうサーバーは、安いのですが、CMSを使えるサーバーとは呼べません。
CMS(ワードプレスなど)でサイトを運営するつもりんばラバ、サーバーを変えたほうがいいでしょう。
PHPでのフォルダーごと圧縮する方法、詳しくは、こちらから→PHPでのフォルダーごと圧縮する方法
ただし、フォルダーの中にフォルダーやファイルがある場合には再帰呼び出して中にあるフォルダーやファイルを順次削除する必要があります。
PHPでのフォルダーごと削除する方法、詳しくは、こちらから→PHPでのフォルダーごと削除する方法
解凍のオプションはたくさんあるので詳しく知りたい場合は、検索でオプションを調べるといいでしょう。
今回は、プラグインの一部となるので細かなオプションの説明は他の書き込みに譲ります。
PHPでの圧縮ファイルの解凍方法、詳しくは、こちらから→PHPでの圧縮ファイルの解凍方法
具体的には、
PHPでのフォルダーごと上書きコピーする方法、詳しくは、こちらから→PHPでのフォルダーごと上書きコピーする方法
処理が必要というのは、移動先URLや、テーブル名などのsqlコマンドの文字列の置き換えです。
文字列を置き換えながら1つづつ sqlコマンドを実行する方法を選択します。
PHPでのSQLファイルのデータベーステーブルへの書き込み方法、詳しくは、こちらから→PHPでのSQLファイルのデータベーステーブルへの書き込み方法
サーバー上で動かすプロセスはサーバー側が設定した一定の時間内でしか動かすことができません。
そのジュ移管を越した時点でプロセスは強瀬的に終了させられてしまいます。
そのため時間のかかる処理を行う場合、プロセスをいくつかに分けて処理するようにします。
具体的には、JavaScriptをタイマーで動かし、プロセスを小分けにして処理します。
分割処理のひな型を作りましたので、詳しくはそちらでご確認ください。
今回のメイン構造になります。
Javascriptで1プロセスづつPHPのプロセスを実行させる方法、
詳しくは、こちらから→Javascriptで1プロセスづつPHPのプロセスを実行させる方法
プラグインの外回り制作の詳細はこちらから→プラグインのひな型を使って簡単にプラグインを作る
となると、ひな形で残すのは、
ファイルが大きくなった時PHPの実行時間がサーバーの制限を超す可能性があるので実際のエクスポート、インポートは、javascriptで php を呼び出す形にします。
そのため、データベーステーブルもテーブル単位で出力するようにします。
ここでデータベーステーブル一覧が必要になるわけですが、そうするとテーブル一覧からバックアップするテーブルを指示することも可能になるなと夢が膨らみます。
情報というより、使用中のデータベース名、そのデータベースを操作できるデータベースユーザーのIDとパスワード。
データベースがどこにあるか=データベースホスト名。
ターゲットのデータベース(現在ワードプレスが使っているデータベースのテーブルプレフィックス)
それらは、以下の変数に入っています。
データベーステーブルのSQLファイル出力
(複数あるのでフォルダーに投げ込んでテストサイトに渡す)
※以下のモジュールは、テーブルの削除機能もいれてあります。
すぐ再生できるように all-in-one-migration でバックアップしておきます。
データベース内のURLの置き換え機能追加
リカバリー後ログインできるか確認
プラグイン/メディアの zip 解凍
プラグインフォルダーを圧縮
データベースフォルダー圧縮ファイル、プラグインフォルダー圧縮ファイル、メディアフォルダーの圧縮 の圧縮
データベースフォルダー圧縮ファイル、プラグインフォルダー圧縮ファイル、メディアフォルダーの圧縮 の解凍
データベーステーブルのリカバリー
データベース内のURLの置き換え
解凍フォルダーの削除
all-in-one-migration もどきのファイル一覧から解凍
all-in-one-migration もどきのファイル一覧から削除
データベーステーブル一覧からテーブルの削除機能追加
制作中に思いついたら書き足していく。
出来上がったプラグインだけ欲しい方は
こちらから→wp_migration_yuzu
止まらない all-in-one-migrationもどきプグインの自作
ワードプレスの引っ越しといえば、all-in-one-migration の plugin を使います。ごめん、この決めつけはマイブームwww
でも all-in-one-migration でバックアップ取ってたけどリカバリーできない!って、リカバリー中に止まりますというのはよく相談される。
バックアップの時に php のバージョンを合わせることと pluginを全部止めるってしておけば、大抵は問題なくリカバリーできます。
でも、よくわからない(多いのは独立したWEBデザイナーさん)方が
「なんかバックアップできるみたいだからいれてバックアップしてる。」
とか、
「やっぱバックアップは自動でやってほしい。このプラグインだと”できそうだから”」
とか、やっちゃってるんですよね。
いや、自分で使うツールなんだから最低でもリカバリーテストぐらいやりなさいよ。なんですけどね。
all-in-one-migration ならまだしも、ほかのバックアップツールの多くは有料にしないとリカバリーできないから。
all-in-one-migration は、まだ敷居が低いし無料でもなんとかできる(私は)
でも実際問題起っちゃうんですわ。
そうなったら今のところお手上げ。メタデータをバックアップしてきて復旧するしかない。
せめてプラグインの有効化フラグを倒せたら即メタでのリカバリーしなくていいんですけどね。
all-in-one-migration の中を探ってみたけど、単にDBリカバリーしてるだけでいちいち見てない。
ので、自作しようと。
折角なら、自作工程を書き残しておこうと。
all-in-one-migrationが、こうなればいいなぁと思ってるあなたの参考になれば。
ワードプレスのバックアップとリカバリーの方法
ワードプレスのバックアップ、リカバリーのプラグインを作るにあたって、ワードプレスのバックアップとリカバリーの方法を知らないとはじまりません。ワードプレスの構成
ワードプレスは、ワードプレスのスクリプト(php,javascript,css)とデータベース(mysql)から成り立っています。この二つを手元に保存するのがワードプレスのバックアップであり、その手元に保管したデータでワードプレスを再生するののがリカバリーです。
ワードプレスのバックアップ
ワードプレスは、前述のように、スクリプトとデータベースから成り立っています。スクリプトはFTPでダウンロードします。
スクリプトには、ワードプレス本体と後から追加するデータ(メディア、テーマ、プラグイン)の2つがあります。
前者は、ワードプレスの公式サイトからもってくればいいので必ずしもバックアップする必要はありません。
後者の中のテーマ、プラグインもサイトから持ってくるなり、自身で保管しているでしょうからこれも必須ではありません。
ですが、メディア(画像、PDF 等)は、wp-content/upload/の保管されており、そのファイルはフォルダーとファイル名で、データベースのテーブルに結びつけられています。
そのためアップロード先のフォルダーとファイルの関係性が保たれていないといけないため、wp-content/uploads/ のフォルダーごとバックアップする必要があります。
まとめると、
- phpmyadmin で、接頭辞の同じ(テーブル名の先頭の文字が同じもの)テーブルをテーブルごとに sql形式で保存
- wpのフォルダー全部 (wpルート,wp-admin , wp-include , wp-content )をFTPでバックアップ
具体的なバックアップの方法は、こちらに記載してあります。
→ ワードプレスのバックアップを手動で行う方法(プラグインを使わないバックアップ)
ワードプレスのリカバリー
リカバリーは、簡単言うと- 各テーブルのsqlファイルをテキストエディタで開いて、前のURLを新しいURLに置き換える
- 各テーブルのsqlファイルをテキストエディタで開いてテーブルプレフィックス(テーブル名接頭辞)を新しいテーブルプレフィックスに置き換える
- phpmyadmin で各テーブルをデータベースに登録
- wp-config.php のデータベース設定部分、テーブルプレフィックス部分を書き換えてアップロード
- 普通にワードプレスの wp-login.php を呼びだす
具体的なリカバリーの方法は、こちらに記載してあります。
→ ワードプレスのリカバリーを手動で行う方法(プラグインを使わないリカバリー)
all-in-one-migration もどき制作工程(予定)
大まかな構造バックアップ
1つのフォルダー内に
保存したフォルダーを圧縮し、これをバックアップアップファイルとする。
- データベーステーブルフォルダー/SQLデータ
- スクリプト
保存したフォルダーを圧縮し、これをバックアップアップファイルとする。
リカバリー
- 保存したバックアップファイルを解凍
- データベーステーブルを順次データベースに保存
- スクリプトを該当するフォルダーに上書きコピー
- 解凍したフォルダーを削除
- 具体的なPHPでのバックアップ、リカバリーモジュールの作成以下の方法を確立します。
- PHPでのデータベーステーブルのSQL保存方法
- PHPでのフォルダーごと複写する方法
- PHPでのフォルダーごと圧縮する方法
- PHPでのフォルダーごと削除する方法
- PHPでの圧縮ファイルの解凍方法
- PHPでのフォルダーごと上書きコピーする方法
- PHPでのSQLファイルのデータベーステーブルへの書き込み方法
そして、これらを1回のプロセスで終わらせることは、サーバーのプロセスの実行時間にひっかかり不可能なため、JavaScriptで1作業づつ処理させる必要があります。
よって、
Javascriptで1プロセスづつPHPのプロセスを実行させる方法が必要になります。
さらに、全体をプラグインとして、まとめるために「プラグインの作成方法」も必要です。 - プラグインの外回り制作
- データベーステーブルの出力
- テスト用サイトの設定
- データベーステーブルの入力
データフォルダーの表示
テスト用サイトでデータベーステーブルをリカバリーできるか? - プラグイン/メディアの圧縮/解凍
テスト用サイトで プラグイン/メディア リカバリー
- all-in-one にする
止まらない all-in-one-migrationもどきのために javascriptでデータベーステーブルを分割保存
止まらない all-in-one-migrationもどきのために javascriptでプラグインを保存
止まらない all-in-one-migrationもどきのために javascriptでメディアを保存 - all-in-one ファイルの管理
データファイルの表示
- 不要テーブル削除機能追加
- all-in-one-mirationモドキ機能追加
PHPでのデータベーステーブルのSQL保存方法
PHPでのデータベーステーブルのSQL保存方法は、いくつかあります。でもデータ処理の柔軟性とサーバーの差異を吸収することを考えると mysqldump を使うのが一番楽なようです。
詳しくは、こちらから→PHPでのデータベーステーブルのSQL保存方法
PHPでのフォルダーごと複写する方法
PHPでのフォルダーごと複写する方法は、1コマンドで処理することができません。再帰呼び出しをつかってフォルダーの中のフォルダーを追いかける形で処理します。
詳しくは、こちらから→PHPでのフォルダーごと複写する方法
PHPでのフォルダーごと圧縮する方法
PHPでのフォルダーごと圧縮する方法は、いくつか考えらますが、圧縮方法として ZipArchive のが標準的です。ですが、ZipArchiveは、サーバーによってはインストールされていないことがあります。
そういうサーバーは、安いのですが、CMSを使えるサーバーとは呼べません。
CMS(ワードプレスなど)でサイトを運営するつもりんばラバ、サーバーを変えたほうがいいでしょう。
PHPでのフォルダーごと圧縮する方法、詳しくは、こちらから→PHPでのフォルダーごと圧縮する方法
PHPでのフォルダーごと削除する方法
PHPでのフォルダーごと削除する方法は、基本フォルダー内にフォルダーやファイルが存在していなければ rmdir で処理できます。ただし、フォルダーの中にフォルダーやファイルがある場合には再帰呼び出して中にあるフォルダーやファイルを順次削除する必要があります。
PHPでのフォルダーごと削除する方法、詳しくは、こちらから→PHPでのフォルダーごと削除する方法
PHPでの圧縮ファイルの解凍方法
PHPでの圧縮ファイルの解凍方法は、1コマンドで処理できますが解凍場所をしてする必要があります。解凍のオプションはたくさんあるので詳しく知りたい場合は、検索でオプションを調べるといいでしょう。
今回は、プラグインの一部となるので細かなオプションの説明は他の書き込みに譲ります。
PHPでの圧縮ファイルの解凍方法、詳しくは、こちらから→PHPでの圧縮ファイルの解凍方法
PHPでのフォルダーごと上書きコピーする方法
PHPでのフォルダーごと上書きコピーする方法は、再帰呼び出してフォルダー内を順番にコピーしていく必要があります。具体的には、
PHPでのフォルダーごと上書きコピーする方法、詳しくは、こちらから→PHPでのフォルダーごと上書きコピーする方法
PHPでのSQLファイルのデータベーステーブルへの書き込み方法
PHPでのSQLファイルのデータベーステーブルへの書き込み方法は、一括で行う方法など様々ありますが、サイトの引っ越しなどを考慮しているためSQLコマンドを1つづつ処理する必要があります。処理が必要というのは、移動先URLや、テーブル名などのsqlコマンドの文字列の置き換えです。
文字列を置き換えながら1つづつ sqlコマンドを実行する方法を選択します。
PHPでのSQLファイルのデータベーステーブルへの書き込み方法、詳しくは、こちらから→PHPでのSQLファイルのデータベーステーブルへの書き込み方法
Javascriptで1プロセスづつPHPのプロセスを実行させる方法
Javascriptで1プロセスづつPHPのプロセスを実行させる方法を解説します。Javascriptで1プロセスづつPHPのプロセスを実行させる方法
サーバー上で動かすプロセスはサーバー側が設定した一定の時間内でしか動かすことができません。
そのジュ移管を越した時点でプロセスは強瀬的に終了させられてしまいます。
そのため時間のかかる処理を行う場合、プロセスをいくつかに分けて処理するようにします。
具体的には、JavaScriptをタイマーで動かし、プロセスを小分けにして処理します。
分割処理のひな型を作りましたので、詳しくはそちらでご確認ください。
今回のメイン構造になります。
Javascriptで1プロセスづつPHPのプロセスを実行させる方法、
詳しくは、こちらから→Javascriptで1プロセスづつPHPのプロセスを実行させる方法
プラグインの外回り制作
プラグインを作るときのひな型
ひな形を使って all-in-one-migrationもどきの外回り(オプション設定等)を制作。プラグインの外回り制作の詳細はこちらから→プラグインのひな型を使って簡単にプラグインを作る
all-in-one-migrationもどきプラグイン雛形の改良
all-in-one-migrationもどきに必要なモジュールは、実際のバックアップリカバリーを行うページです。となると、ひな形で残すのは、
- ◎ プラグインヘッダ
- ◎ バージョン番号
- ◎ プラグイン名
- ◎ プラグイン説明
- ◎ トレース関数
- ◎ フック
✕ コンテンツ置換
◎ 設定画面
✕ ショートコード - ✕ ショートコード関数
- ✕ コンテンツ置換関数
- ◎ 設定画面設定
- ◎ 設定画面関数
- ◎ option文字列変換関数
- ◎ デフォルト設定関数
- ◎ 文字列置換関数(改行外す)
- ◎ 文字列置換関数(改行)
- ◎ 文字列置換関数(記号→特殊文字)
- ◎ 文字列置換関数(特殊文字→記号)
all-in-one-migration もどきプラグインで雛形に追加する機能
all-in-one-migration もどきプラグインで雛形に追加する機能は、管理画面(設定-all-in-one-migrationモドキ設定画面)から全部呼び出す形になります。- エクスポート
データベースエクスポート+圧縮
プラグインフォルダー圧縮
アップロードフォルダー圧縮
データベース、プラグインフォルダー、アップロードフォルダー圧縮 → 圧縮 - all-in-one-migrationモドキファイル一覧
削除
インポートへリンク - インポート
解凍 → データベース書き込み → プラグイン、アップロードフォルダー展開
ファイルが大きくなった時PHPの実行時間がサーバーの制限を超す可能性があるので実際のエクスポート、インポートは、javascriptで php を呼び出す形にします。
そのため、データベーステーブルもテーブル単位で出力するようにします。
ここでデータベーステーブル一覧が必要になるわけですが、そうするとテーブル一覧からバックアップするテーブルを指示することも可能になるなと夢が膨らみます。
ワードプレスのデータベーステーブルの出力
ワードプレスのデータベーステーブルの出力を行うときに必要になるのがデータベースの情報です。情報というより、使用中のデータベース名、そのデータベースを操作できるデータベースユーザーのIDとパスワード。
データベースがどこにあるか=データベースホスト名。
ターゲットのデータベース(現在ワードプレスが使っているデータベースのテーブルプレフィックス)
それらは、以下の変数に入っています。
- データベース名:DB_NAME
- データベースユーザーID:DB_USER
- データベースユーザーパスワード:DB_PASSWORD
- デーベースホスト:DB_HOST
- データベーステーブルプレフィックス:global $table_prefix;
データベーステーブルの一覧
MySQLのデータベースデータベーステーブルのSQLファイル出力
(複数あるのでフォルダーに投げ込んでテストサイトに渡す)
※以下のモジュールは、テーブルの削除機能もいれてあります。
0001 /********************************************************/
0002 function wp_migration_yuzu_MySQLtable($php_v,$cmd)
0003 /********************************************************/
0004 {
0005
0006 global $table_prefix;
0007 global $wpdb;
0008 $db_name = DB_NAME; //データベース名の取得
0009 $db_user = DB_USER; //データベース接続ユーザーの取得
0010 $db_pass = DB_PASSWORD; //データベース接続用パスワードの取得
0011 $db_host = DB_HOST; //データベースホストの取得
0012 $db_pfix = $table_prefix; //データベースホストの取得
0013
0014 $link = mysqli_connect($db_host, $db_user, $db_pass,$db_name);
0015 if (!$link) {
0016 return('');
0017 }
0018 $stack = array();
0019 // データ処理
0020 if($cmd == 'tablelist' || $cmd == 'tabledelete'){
0021 $sql = "SHOW ";
0022 $sql.= "TABLES ";
0023 $sql.= ";";
0024 if( $result = mysqli_query($link, $sql) ){
0025 while ($row = $result->fetch_row()) {
0026 if(substr($row[0],0,strlen($db_pfix))==$db_pfix ){
0027 // テーブル一覧
0028 $stack[] = $row[0];
0029
0030 // 全テーブル削除
0031 if( $cmd == 'tabledelete' ){
0032 $sql = "DROP ";
0033 $sql.= "TABLE ";
0034 $sql.= $row[0];
0035 $sql.= ";";
0036 if( $resultA = mysqli_query($link, $sql) ){
0037 echo 'del query='.$sql.'
0038 ';
0039 }
0040 }
0041 }
0042 }
0043 }
0044 }
0045 mysqli_close($link);
0046 return($stack);
0047 }
テスト用サイトの設定
新しいワードプレスサイトの設定すぐ再生できるように all-in-one-migration でバックアップしておきます。
データベーステーブルの入力
データベースバックアップ(フォルダー)からのデータベーステーブルのリカバリーデータベース内のURLの置き換え機能追加
リカバリー後ログインできるか確認
プラグイン/メディアの圧縮/解凍
プラグイン/メディアの zip 圧縮プラグイン/メディアの zip 解凍
all-in-one にする
データベーステーブルフォルダーを圧縮プラグインフォルダーを圧縮
データベースフォルダー圧縮ファイル、プラグインフォルダー圧縮ファイル、メディアフォルダーの圧縮 の圧縮
データベースフォルダー圧縮ファイル、プラグインフォルダー圧縮ファイル、メディアフォルダーの圧縮 の解凍
データベーステーブルのリカバリー
データベース内のURLの置き換え
解凍フォルダーの削除
all-in-one ファイルの管理
all-in-one-migration もどきのファイル一覧作成all-in-one-migration もどきのファイル一覧から解凍
all-in-one-migration もどきのファイル一覧から削除
不要テーブル削除機能追加
データベーステーブル一覧表示機能追加データベーステーブル一覧からテーブルの削除機能追加
all-in-one-mirationモドキ機能追加
今のところ特に考えていない。制作中に思いついたら書き足していく。