WordPressのバックアップ自動化

自動バックアップがおかしい

WordPressの投稿データを定期的にバックアップするようにしています。

BackWPupプラグインを使っています。頻度は1週間に1回。あまり回数が多くてもバックアップデータが多くなるので、この回数としました。

自動実行機能を設定したものの、使い始めて3週間、毎回すべて失敗していました。へんな時間にバックアップされているのです…。

自動実行が上手く動かない理由

ネットで調べてみると、BackWPupの自動実行機能はWorpPressのwp-cronという機能を使っているらしいのですが、wp-cronの仕組みは、

  1. だれかがWordPressのページにアクセスする。
  2. するとWordPressの内部処理でwp-cron.phpが実行される。
  3. wp-cron.phpでジョブの予定時刻と現在の時刻がチェックされ、開始予定のジョブがあればジョブを開始する。

という動作を行うようです。

例えばバックアップ設定を12:00に行なうように設定します。しかし12:00になってもバックアップは始まりません。12:00以降に誰かがアクセスして、バックアップが始まります…。

通りで、いつも設定時間から2~3時間遅れでバックアップ開始するはずです。なんのことはなく、「今回は設定がうまく行っているかな?」と確認しに行ったことがトリガーになってバックアップされていたのでした。

つまり、wp-cronは「なんちゃってcron」になっているらしい。名前に騙された!

対応方法

というわけで、対応方法をいろいろと考えた結果、一応は解決出来たっぽいです。せっかくなので不採用案も含めていろいろ書いてみましょう。

解決策1:EasyCron(不採用)

BackWPupの設定で、「 EasyCron.comで - まず API キーを設定してください。」と注意書きがあります。私はこれを見逃していました。

これを設定すると、外部(EasyCron)から定期的にWordPressにアクセスされるようになり、wp-cron機能が想定通りに動くようです。

ただ、無料サービスから定期アクセスとかいうのが、ちょっと気持ち悪かったので、他の方法を試してみることにし、見送りました。(うまく行かなければ、これを使うしかないかなっと思っています。)

解決策2:wp-cron.phpの実行(不採用)

解決策をネットで調べていくと、「cronでwp-cron.phpを直接実行する」という方法が見つかりました。

/usr/bin/php ${WordPressのディレクトリ}/wp-cron.php

というコマンドをcronで実行するというアイデアです。

そこで、まず、cronではなく直接上のコマンドを実行してみたのですが…。

HTMLフォーマットのテキストが標準に出力され、さらに、下のようなPHPのエラーも出てきます。

PHP Fatal error:  Uncaught Error: Call to undefined function mb_strtolower() in XXXX.php:34
Stack trace:

あまりスマートな回避策ではありません。何よりエラーが出ていて、どこでどんな悪影響が生じるか…と考えると怖いので、これも不採用です。

解決策3:wgetでアクセス(採用)

そこで考えたのですが、WordPressのページにアクセスすればよいだけなら、wgetが使えます。

cd ${書きこみ可能なディレクトリ}
/bin/wget localhost/wp -q --spider

wgetでWordPressのページにアクセスします。(自部自身なので、URLもlocalhostで指定できますね。)

wgetはアクセスしたURLのファイルを取得してファイル出力するコマンドですが、--spiderをつければ、アクセスだけでファイルは作成されません。また、-qをつけると余計なメッセージも出ません。

ただ、書き込みできないディレクトリをカレントディレクトリにしているとwgetがエラーになるので、cdで書き込み可能なディレクトリに移っています。(rootで実行するなら、いらないかも…。)

上記のファイルをスクリプトファイルにでもし、UNIXのcronで実行すればよいです。

実際例

私は、/mnt/WpBkup/ をバックアップファイル置き場としていて、関連ファイルをそこに置いています。そのため、/mnt/WpBkup/accessWP.cshという名前で以下のファイルを作っています。

#!/usr/bin/tcsh

cd /mnt/WpBkup/
/bin/wget localhost/wp -q --spider

バックアップ処理は毎週木曜日08:00に起動することにし、cronは以下の設定をしました。

0 8 * * 4 /mnt/WpBkup/accessWP.csh

BackWPupの自動実行の設定は、木曜07:55に実行するようにしました。cronと同じ時間にセットするとタイミングが逆になる可能性もあるので、5分ほど前に設定しています。

これでwp-cron的には木曜07:55~に起動する設定になり、accessWP.cshで8:00にページアクセスされることによって、実際には08:00にバックアップ開始となります。

コメント