少しだけ荒らしに強いバックアップ

バックアップを荒らしに強くするためにはバックアップサイクル($cycle)を短くし保存世代($maxage)を多く取る事で対応できますが、反面バックアップがディスクを圧迫したり長い目で見た変更履歴を分かりにくくする事が問題になります。
これを両立させる一つの解決策を提案します。

変更されるバックアップ仕様

バックアップが行なわれるタイミング

  • $cycleで設定した時間を経過後にページの変更をした場合(従来通り)
  • $cycleの設定に関らず、ページ内容に変更や削除*1が加えられた場合(新設)

バックアップの保存処理

  • $force_backupで設定した時間までは、$maxageの制限を越えてバックアップを保存
  • $force_backupで設定した時間を超えたバックアップは、バックアップ処理が行われる時に$cycleの保存間隔に従って自動削除される
    注意:過去にバックアップサイクルを短く設定していた場合、この処理で過去のバックアップが削除される可能性があります

バックアップ履歴のイメージ

  • バックアップ一覧
    • hogehoge のバックアップを削除
    • 1 (2005-07-01 06:54:06 (金)) [ 差分 | 現在との差分 | ソース ] ----↑過去
    • 2 (2005-07-02 05:54:04 (土)) [ 差分 | 現在との差分 | ソース ]   $cycle時間より大きい間隔で
    • 3 (2005-07-02 09:05:36 (土)) [ 差分 | 現在との差分 | ソース ]   $maxage個のバックアップを保存
    • 4 (2005-07-02 12:09:52 (土)) [ 差分 | 現在との差分 | ソース ] ----$force_backupの設定時間
    • 5 (2005-07-02 12:18:32 (土)) [ 差分 | 現在との差分 | ソース ]   $maxage,$cycleと無関係に
    • 6 (2005-07-02 12:25:18 (土)) [ 差分 | 現在との差分 | ソース ]   変更・削除*2があったら保存
    • 7 (2005-07-02 12:25:56 (土)) [ 差分 | 現在との差分 | ソース ] ----↓現在

差分*3

--- 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)

コメント

  • もっと良い方法はあると思いますがとりあえず提案させて頂きました。これでしばらく静かにしていようと思います。失礼しました。 -- Cue 2005-07-02 (土) 14:39:10

*1 差分で赤い行が存在する場合です。内容の追加だけが行なわれたり、改行のみの行が消された時は該当しません。
*2 差分で赤い行が存在する場合です。内容の追加だけが行なわれたり、改行のみの行が消された時は該当しません。
*3 1.4.5_1ベース

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-03-08 (月) 13:09:29
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.225 sec.

OSDN