WordPress の投稿データを PHP および Cron を使用して1時間毎に自動バックアップし、画像データはローカル PC に効率的にバックアップしておく…というバックアップ方法をご紹介いたします。
PHP で WordPress を自動バックアップする方法
レンタルサーバーの自動バックアップ機能からファイルを復元できる場合もあるようですが、レンタルサーバーのバックアップは1日単位であることが多いということと、万が一「復旧できません」と言われてしまった場合に備えて(それで呆然とされている方を過去に見たことがあるので)、自分でも復元できるように … PHP で WordPress を自動バックアップする方法を考えてみたいと思います。
バックアップが必要なものは?
WordPress でテーマをアップロードし、プラグインをインストールし、画像をアップロードし、ブログ記事を投稿する…という過程で、以下の項目に関してバックアップが必要になると思われます。
- テーマ … ローカル PC にオリジナルファイルを保存しておけば OK です。
- プラグイン … WordPress 内から参照できるので基本的に不要ですが、WordPress 内から参照できない場合には、開発元のサイトからダウンロードしたオリジナルソースをローカル PC に保存しておけば OK です。
- 投稿したブログ記事 … 別途バックアップが必要です。
- 投稿した画像ファイル等 … 別途バックアップが必要です。
投稿したブログ記事(テキストデータ)はどこにある?
投稿したブログ記事のテキストデータは…僕が調べた限りでは WordPress の MySQL データベース内にすべて保存されているようです。つまり、MySQL データベースを自動でバックアップしておけば(画像を除いて)いつでも復元できると思います。これを当社仕様に従って、Cron で1時間ごとにバックアップファイルを自動で生成・保存しておきたいと思います。
PHP で MySQL データベースをバックアップするプログラム
PHP で MySQL データベースをバックアップするコードは…こんな感じです。
//データベース定数初期化
define("DB_HOST", "???");
define("DB_USER", "???");
define("DB_PASSWORD", "???");
define("DB_NAME", "???");
//ディレクトリ定数初期化
define("DIR_BACKUP", "./bak/");
//バックアップ先ディレクトリがなければ作成します
if (!(file_exists(DIR_BACKUP) && is_dir(DIR_BACKUP))){
mkdir(DIR_BACKUP);
}
//バックアップファイル名を決定します
$strBackupFileName = date("YmdHis") . ".sql";
//ダンプコマンドはこちら
$strCommand = "mysqldump ";
$strCommand .= "-h " . DB_HOST . " ";
$strCommand .= "-u " . DB_USER . " ";
$strCommand .= "-p" . DB_PASSWORD . " ";
$strCommand .= DB_NAME . " ";
$strCommand .= "> " . DIR_BACKUP . $strBackupFileName . " ";
$strCommand .= "2> mysqldump_error.txt";
//実行
$lngLastLine = system($strCommand);
zip 圧縮してパスワードをかける
作成したバックアップファイルは、そのまま保存しておくとファイルサイズも大きくセキュリティ的にも問題があるので、zip 圧縮してパスワード(例. “hogehogefugafuta”)をかけておいた方が良いと思います。そのための追加コードはこちら…
//zip ファイル名を決定します
$strBackupZipFileName = date("YmdHis") . ".zip";
echo exec("cd 'bak/'; zip -P 'hogehogefugafuga' '" . $strBackupZipFileName . "' '" . $strBackupFileName . "';");
//元のバックアップファイルを削除しておきます
unlink($strBackupFileName);
動作確認の方法
ドメイン名 https://hogehoge.com/ の場合、以下を実行することで WordPress データベースをバックアップの動作確認をすることができます。
- 上記のコードを backup.php としてローカル PC に保存します。
- FTP で hogehoge.com のルートディレクトリにアップロードします。
- ブラウザから https://hogehoge.com/backup.php を呼び出して実行します。
Cron で定期実行する
動作確認が完了したら、Cron で定期実行する必要があります。当社ではウェブシステムの運用の際には、1時間毎にデータベースのバックアップを作成するようにしています。
エックスサーバーの Cron 設定方法
https://www.xserver.ne.jp/manual/man_program_cron.php
作成されたバックアップファイルを別の場所にバックアップするには?
Cron の定期実行で作成された WordPress データベースのバックアップファイルは、その場所に置いておくだけでは、サーバー障害やハッキング被害などで運用中のドメインデータが消去されてしまった場合には 一緒に削除されてしまう可能性が高いです。従って、別の場所にバックアップしておく必要があります。その方法として考えられるのは 以下の2つの方法です。
- 電子メールに添付して定期的にメールで送信しておく。
※FTP で別のサーバーに同期する…ということも考えられますが、問題なのは バックアップデータが削除されてしまった状態で同期実行されると、バックアップ先のデータも(空の状態が同期されて)併せて削除されてしまうということは 回避しなければなりません。従って別のサーバーに同期する…という方法は基本的に良い方法とは言えません。
投稿した画像ファイルのバックアップ
画像ファイルは基本的にファイルサイズが大きく、1時間毎にバックアップを保存する…などは膨大なディスクスペースや リソースが必要になって 大掛かりになってしまいます。
要は WordPress が消失したとしても再現できれば良い訳ですから … WordPress にアップロードするファイルは、事前にローカル PC に(後でわかるように)保存しておけば良い … ということで良いと思います。
当社のやり方
ブログを投稿する際に「URL スラッグ」を入力していると思いますが … 例えば、この記事の URL は https://blog.soln-sns.net/backup-wordpress/ ですので、「URL スラッグ」は「backup-wordpress」になります。
この URL に使用する画像は “backup-wordpress.jpg” や “backup-wordpress-2.png” などとして、ローカル PC に保存する … というルール決めをしておけば、WordPress が消失したとしても、まずブログ記事(テキストデータ)を復元し、その URL ごとにローカル PC に保存している画像ファイル等をアップロードしていけば サイト全体が復元できると考えられます。
[…] WordPress を PHP (Cron) で自動バックアップする方法 WordPress の投稿データを PHP… […]