バックアップを荒らしに強くするためにはバックアップサイクル($cycle)を短くし保存世代($maxage)を多く取る事で対応できますが、反面バックアップがディスクを圧迫したり長い目で見た変更履歴を分かりにくくする事が問題になります。
これを両立させる一つの解決策を提案します。
バックアップが行なわれるタイミング
バックアップの保存処理
バックアップ履歴のイメージ
--- pukiwiki.ini.org.php Mon Feb 07 13:22:40 2005 +++ pukiwiki.ini.php Sat Jul 02 10:09:46 2005 @@ -269,6 +269,9 @@ $cycle = 3; // Wait N hours between backup (0 = no wait) $maxage = 120; // Stock latest N backups +// 削除行が存在する時の強制バックアップを保存する時間(0:この機能を無効にする) +$force_backup = 24; + // NOTE: $cycle x $maxage / 24 = Minimum days to lost your data // 3 x 120 / 24 = 15
--- file.org.php Sat Jan 29 13:29:34 2005 +++ file.php Sat Jul 02 09:31:32 2005 @@ -38,7 +38,8 @@ file_write(DIFF_DIR, $page, $diffdata); // Create backup - make_backup($page, $postdata == ''); // Is $postdata null? + $is_corrected = preg_match('/^-/m', $diffdata); + make_backup($page, $postdata == '', $is_corrected); // Is $postdata null? // Create wiki text file_write(DATA_DIR, $page, $postdata, $notimestamp);
--- backup.org.php Sat Jan 29 13:40:40 2005 +++ backup.php Sat Jul 02 08:59:12 2005 @@ -25,10 +25,11 @@ * @return Void */ -function make_backup($page, $delete = FALSE) +function make_backup($page, $delete = FALSE, $is_corrected) { global $cycle, $maxage; global $do_backup, $del_backup; + global $force_backup; if (PKWK_READONLY || ! $do_backup) return; @@ -40,10 +41,26 @@ if (! is_page($page)) return; $lastmod = _backup_get_filetime($page); - if ($lastmod == 0 || UTIME - $lastmod > 60 * 60 * $cycle) + if ($lastmod == 0 || UTIME - $lastmod > 60 * 60 * $cycle || + ($force_backup != 0 && $is_corrected && UTIME > $lastmod)) { $backups = get_backup($page); - $count = count($backups) + 1; + + if($force_backup == 0){ + $count = count($backups) + 1; + }else{ + $count = $prev_time = 0; + foreach($backups as $age=>$data){ + if(UTIME - $data['time'] <= 3600 * $force_backup) + break; + if($data['time'] - $prev_time <= 3600 * $cycle){ + unset($backups[$age]); + }else{ + $count++; + $prev_time = $data['time']; + } + } + } // 直後に1件追加するので、(最大件数 - 1)を超える要素を捨てる if ($count > $maxage)