ファーストサーバのデータ消失事件以降、このブログのデータをWordPressプラグイン「BackWPup」で定期的にバックアップしています。
BackWPup (WordPress)
このプラグイン、WordPressの構成ファイルやアップロードした写真、データベースの内容などもろもろを圧縮ファイルにしてバックアップしてくれます。スケジュールによる定期実行が可能で、バックアップ先もサーバー上のフォルダやメール送信、FTPサーバー、クラウドストレージが選べます。私は1日1回、Amazon S3にアップするようにしています。
非常にすぐれたこのプラグインなのですが、いつからか古いアーカイブファイルが消えなくなってしまいました(バックアップ先に何世代分を残すかを設定できるのですが、その設定が利いていないような挙動です)。最初は手動で古いアーカイブファイルを消していたのですがさすがに面倒になってきたので、思い切ってソースコードを読んでみました。
私が読んでみたのは4/9現在の最新バージョンである3.0.6のソースコード。それっぽいコードを読んだりPHPにログコードをいれて動かしてみたりいろいろやってみた結果、問題はclass-job.phpのis_backup_archiveメソッドにあることがわかりました。このメソッドはファイルがバックアップアーカイブかどうかを判定するメソッドで、結果がTRUEならばアーカイブファイルと判定されて削除の対象となります。
問題となっている処理は年月日時分秒として妥当な文字列を判定する処理で、「分」および「秒」を判定するための正規表現が
‘(0[1-9]|[1-5][0-9])’
と定義されています。この正規表現にマッチするのは「01」~「09」、「10」、「11」~「59」となり、「00」はマッチしません。
私が設定していたバックアップスケジュールは毎日深夜3時ちょうどだったので、1分以内にバックアップが完了した場合には分が「00」になり、正規表現にマッチしなくなっていたという次第です。私の場合は分が問題でしたが、秒でも本質的に同じ問題が発生しえます。
当面の回避としては、
・バックアップファイル名に「分」「秒」を含ませるのをやめる
・スケジュールを「00分」で設定するのをやめる(15分、30分、45分)
などが考えられますが、プログラム側の不具合であることは明白なので修正されることを期待します(今度バグレポート送っておきます)。