Deutschland United States United Kingdom
ContentLion - Open Source CMS

Backup-Möglichkeit aus dem CMS heraus

Backup-Möglichkeit aus dem CMS heraus

Vielleicht könnte man sogar automatisiert über einen Cron Backups machen lassen.
Oder alternativ per Mausklick. Das ganze dann am allerbesten noch zippen.

Ich möchte mich dieses Problems einmal annehmen.^^

Poste vorher erstmal, wie du es planst ;-)

Also als erstes mal eine Ordner backup auf der root-Ebene erstellen. Dort ein Skript mit folgendem Inhalt.:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// Include von PclZip
require_once('../system/thirdparty/pclzip/pclzip.lib.php');


$datum date("d_ m_ y");

// Dateiname
$archive = new PclZip('backup-'.$datum.'.zip');

// Verzeichniss zu Archiv
$v_dir dirname(getcwd()); // or dirname(__FILE__);
$v_remove $v_dir;

//Archivbau
$v_list $archive->create($v_dirPCLZIP_OPT_REMOVE_PATH$v_remove);

if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));

}

?>
Archiv wurde erstellt.



_________________________________________________________
Ich habe es mal backup.php genannt.
Es wird bei Ausführung eine zip-Datei im backup-Ordner mit dem Namen backup-datum.zip erstellt.

Das muss dann nur noch runter geladen werden.

Damit das funktioniert muss nur noch die Bibliothek PclZip in system/thirdparty gebackt werden. Steht im Übrigen auch unter GNU LESSER GENERAL PUBLIC LICENSE.
Was haltet ihr davon?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Daniel Busch« (16. Mai 2012, 00:04)


Ansich schon gut. Das wichtigste ist allerdings die Datenbank,

Ok, ich arbeite dran. ^^

Edit

So---->

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
// Include von PclZip
require_once('../system/thirdparty/pclzip/pclzip.lib.php');


$datum date("d_ m_ y");

// Dateiname
$archive = new PclZip('backup-'.$datum.'.zip');

// Verzeichniss zu Archiv
$v_dir dirname(getcwd()); // or dirname(__FILE__);
$v_remove $v_dir;

//Archivbau
$v_list $archive->create($v_dirPCLZIP_OPT_REMOVE_PATH$v_remove);

if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));

}

?>
Archiv wurde erstellt.
<?php
@set_time_limit(0);
include ('../system/dbsettings.php');
//Verbindung zur Datenbank
$verbindung mysql_connect("$dbhost","$dbuser","$dbpassword") or die("Username/Passwort falsch");

// MySQL Datenbanken
$dbname = array();
$dbname[]= "$db";

// Pfad zur aktuellen Datei
$path ereg_replace ("\\\","/",__FILE__);
$path = dirname ($path);
$path = trim($path);

// Pfad zum Backup
$path .= "/dbackup/";
// Dateityp
$filetype = "sql";

//Dateieigenschaften
$cur_time=date("d.m.Y H:i");
$cur_date=date("Y-m-d");


//Erstelle Struktur von Datenbank
function get_def($dbname$table) {
global $verbindung;
$def = "";

$def .= "CREATE TABLE $table (\n";
$result = mysql_db_query($dbname, "SHOW FIELDS FROM $table",$verbindung);
while($row = mysql_fetch_array($result)) {
$def .= " $row[Field$row[Type]";
if ($row["Default"] != "") $def .= " DEFAULT '$row[Default]'";
if ($row["Null"] != "YES") $def .= " NOT NULL";
if ($row[Extra] != "") $def .= " $row[Extra]";
$def .= ",\n";
}
$def = ereg_replace(",\n$","", $def);
$result = mysql_db_query($dbname, "SHOW KEYS FROM $table",$verbindung);
while($row = mysql_fetch_array($result)) {
$kname=$row[Key_name];
if(($kname != "PRIMARY") && ($row[Non_unique] == 0)) $kname="UNIQUE|$kname";
if(!isset($index[$kname])) $index[$kname] = array();
$index[$kname][] = $row[Column_name];
}
while(list($x$columns) = @each($index)) {
$def .= ",\n";
if($x == "PRIMARY") $def .= " PRIMARY KEY (" . implode($columns, "") . ")";
else if (substr($x,0,6) == "UNIQUE") $def .= " UNIQUE ".substr($x,7)." (" . implode($columns, "") . ")";
else $def .= " KEY $x (" . implode($columns, "") . ")";
}

$def .= "\n);";
return (stripslashes($def));
}

//Erstelle Eintäge von Tabelle
function get_content($dbname$table) {
global $verbindung;
$content="";
$result = mysql_db_query($dbname, "SELECT FROM $table",$verbindung);
while($row = mysql_fetch_row($result)) {
$insert = "INSERT INTO $table VALUES (";
for($j=0; $j<mysql_num_fields($result);$j++) {
if(!isset($row[$j])) $insert .= "NULL,";
else if($row[$j] != "") $insert .= "'".addslashes($row[$j])."',";
else $insert .= "'',";
}
$insert = ereg_replace(",$","",$insert);
$insert .= ");\n";
$content .= $insert;
}
return $content;
}

//Funktion um Backup auf dem Server zu speichern
function write_backup($val,$newfile,$newfile_data)
{
global $path,$cur_date,$filetype,$backup_pfad;

$backup_pfad[] = $path.$val."_tabellen_".$cur_date.".".$filetype;
$backup_pfad[] = $path.$val."_eintraege_".$cur_date.".".$filetype;


$fp = fopen ($path.$val."_tabellen_".$cur_date.".".$filetype,"w");
fwrite ($fp,$newfile);
fclose ($fp);


$fp = fopen($path.$val."_eintraege_".$cur_date.".".$filetype,"w");
fwrite ($fp,$newfile_data);
fclose ($fp);
}

//Backup erstellen
while (list(,$val) = each($dbname))
{
$newfile="# Tabellenbackup: $cur_time \r\n# \r\n";
$newfile_data="# Eintraegebackup: $cur_time \r\n# \r\n";

//backup schreiben
$tables mysql_list_tables($val,$verbindung);
$num_tables = @mysql_num_rows($tables);
$i 0;
while($i $num_tables)
{
$table mysql_tablename($tables$i);

$newfile .= "\n# ----------------------------------------------------------\n#\n";
$newfile .= "# Tabellen '$table'\n#\n";
$newfile .= get_def($val,$table);
$newfile .= "\n\n";


$newfile_data .= "\n# ----------------------------------------------------------\n#\n";
$newfile_data .= "#\n# Eintraege '$table'\n#\n";
$newfile_data .= get_content($val,$table);
$newfile_data .= "\n\n";
$i++;
}

write_backup($val,$newfile,$newfile_data);
} //End: while
?>
Datenbankbackup ist fertig.


____________________________________________________________________________________________________________________
Dateisystem auf Server siehe Anhänge





_____________________________________________________

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Daniel Busch« (16. Mai 2012, 00:06)


EIn paar kleine Verbesserungsvorschläge

- Language-Klasse benutzen, um es auch auf Englisch bzw. bald auch auf polnisch zum laufen zu bringen
- Dann noch als geplante Aufgabe: http://www.contentlion.de/doku/geplante-aufgaben.html
- Zu guter letzt eine Möglichkeit die Aufgabe im Backend zu deaktivieren und das ganze auch manuell zu starten

Ist aber sonst so wie du/wir das haben wollten oder.
Reicht auch nach meinem Urlaub nächste Woche. Sprich ab Juni?^^

Bevor ich mich an das Formularproblem wage werde ich mich ersteinmal mit dem Backupsystem weiter befassen.

Also:

Zitat

- Language-Klasse benutzen, um es auch auf Englisch bzw. bald auch auf polnisch zum laufen zu bringen
- Dann noch als geplante Aufgabe: http://www.contentlion.de/doku/geplante-aufgaben.html
- Zu guter letzt eine Möglichkeit die Aufgabe im Backend zu deaktivieren und das ganze auch manuell zu starten

Wie du möchtest. Nur die Einbindung in die Version wird erstmal dauern, weil das fixen von Bugs z.Z. wichtiger ist.

Backupumfrage

57%

Implementierung als Corefunktion? (4)

43%

Realisierung als Plugin? (3)

Was meint Ihr?

Bitte, Bitte nehmt solch eine Funktion nicht als Plugin sondern mit in den Core!
Es sieht ehrlich gesagt bescheutert aus, wenn das CMS schon zigtausende Plugins mitliefert. Bei anderen CMSen ist sowas ja auch im Code. ^^

Ich bin klar gegen die Einbindung als Plugin. Da meine Begründung eher eine Frage des Grundkonzepts von ContentLion ist und auch etwas länger ausfällt, bitte ich euch das hier zu lesen und diskutieren: http://blogs.contentlion.org/stefan-wien…hlanker-werden/

Ich sehe dies nun auch ein und stimme stevieswebsite zu.
Bitte eine Abstimmung auf "Core" ändern oder neue Umfrage starten! :D

Für mich MUSS diese Funktion im Core inbegriffen sein.

Wenn wir eine solide Stellung am Mark haben wollen, muss soetwas meiner Meinung nach inkludiert sein und bestens funnktionieren.
Konzeptioniert sollte es halt so sein das egal welche Version der Benutzer verwendet, er immer seine Backups einspielen kann.

Auch wenn es ein Plugin ist, heißt das nicht unbedingt, dass es nicht mit der Version mit ausgeliefert wird, wie z.B. die Widgets. :D

@JuKu: Danke, genau das wollte ich auch sagen ;-)

Ähnliche Themen