Backup-Lösung für FTP und MySQL in PHP

Dieser Beitrag ist eine Ergänzung bzw. Erweiterung des vorherigen Posts „FTP-Backup-Lösung mit PHP“. Die große Neuerung der Version 1.2 ist die Funktion MySQL Datenbanken sichern zu können. Auch hier wird ein Backup erstellt, überschüssige Backups (wenn mehr vorhanden sind als der gewünschte Maximalwert) werden gelöscht und neue Backups ggf. zu einem externen Server übertragen. Mit Version 1.2.1 gibt es zusätzlich die Möglichkeit, ALLE Ordner der Root-Ebene, mit Ausnahmen, zu sichern und Version 1.2.2 ermöglicht detailliertere Ausnahmen. In Version 1.3 wird das Backup mittels eines weiteren Skripts aufgerufen. Mehr dazu weiter unten.

Features

Diese Lösung (v1.3) bietet nun folgenden Funktionsumfang:

  • beliebig viele Ordner des All-Inkl Accounts in einzelne .tar.gz Archive sichern
  • oder: alle Ordner der Root-Ebene, mit möglichen Ausnahmen, sichern
  • Detailliertere Ausnahmen mit Datei- und Ordnermasken wie z.B. „*.tar.gz“
  • Einschränkung der Anzahl aufgehobener Backups – älteste Backups werden automatisch gelöscht
  • detaillierte Ausgabe inklusive benötigter Zeit
  • E-Mail Benachrichtigung
  • Farbliche Hervorhebung
  • Verbesserungen des Backup Prozesses, zusätzliche Überprüfungen und Debug Infos bei Fehlern
  • Verbinden eines externen FTP Server und Kopieren aller neuen Backups
  • Angabe eines beliebigen FTP Ports
  • Verbindung über FTPs (SSL FTP) Port 21 wird verwendet, unsicheres FTP nur noch als Fallback
  • detailliertere Informationen über die Backups in der Benachrichtigungsmail
  • Backup von beliebig vielen MySQL Datenbanken von localhost, Aufräumen der Backups und Export an externen Server
  • E-Mail Anpassungen über Parameter möglich – Betreff, Anmerkungen, Details
  • ausführliche Ausgabe aller Backups im Skript und per Mail

Zwischen den Zeilen 37 und 82 findet ihr alle Variablen, die ihr anpassen müsst/könnt.

Zur Datenbanksicherung ist zu sagen, dass diese auf den Hoster All-Inkl optimiert ist. Sie sichert nur Datenbanken von localhost und benötigt den PHP Befehl „exec()“ sowie die Komponenten „mysqldump“ und „gzip“, die auf All-Inkl Servern erlaubt bzw. installiert sind. Auf anderen Hostern müssen daher ggf. diese Möglichkeiten geschaffen oder die MySQL Sicherung (Zeile 190-191) verändert werden.

Update 03/2020: Blogleser Crunchy hat mich netterweise darauf hingewiesen, dass durch den Wegfall des apache-mode die Skriptausführungszeit nun auf 10 Minuten begrenzt ist. Daher ist es nun sinnvoll, das Backupskript über ein zweites Skript aufzurufen. All-Inkl gibt das Format grob vor und ich habe unten im Download ein solches Aufruf-Skript auch mit eingefügt. Ladet euch also beide Skripte und richtet euch einen Cronjob mit dem Aufruf-Skript init-backup.php ein.

Screenshot

Das Bild zeigt die Ausgaben des Backup Skripts und die versendete E-Mail Benachrichtigung

Code

Schaut für Code-Alternativen oder ein weniger komplexes System auch auf die Version 1.1 und 1.0

Update 08.2017: Version 1.2.2 nur noch als Download
Update 03.2020: Version 1.3, init-backup.php hinzugefügt und kleinere Fehler im Backup-Skript behoben
Code/Download der init-backup.php
Code/Download der backup.php

Sicherheit: Absicherung mit .htpasswd

Das Verzeichnis, in dem die backup.php und die Backups liegen, sollte natürlich mit einer .htpasswd abgesichert werden. Mit einer eingerichteten .htpasswd Datei ist zuerst ein Login nötig, eh man auf bestimmte Bereiche des Webspaces zugreifen darf:
Das Bild zeigt eine Login Datenabfrage beim Aufruf der Backup URL
Die Datei .htpasswd enthält hierbei die Login Daten und in der .htaccess des Backup Unterordners wird festgelegt, dass eine .htpasswd diesen Ordner schützt. Die .htpasswd generiert ihr euch am besten mit diesem Generator und baut sie dann folgendermaßen in die .htaccess dieses Ordners ein:

AuthType Basic
AuthName "Backups"
AuthUserFile /www/htdocs/all-inkl-account/backup/.htpasswd
Require valid-user

Sicherheit: Absicherung mit .htaccess

Da wir schonmal bei .htaccess sind, erhöhen wir die Sicherheit mit ein paar weiteren grundlegenden Zeilen:

#block access to certain file types
<FilesMatch ".(htaccess|htpasswd|ini|phps|log|sh|tar.gz)

quot;>
Order Allow,Deny
Deny from all
</FilesMatch>

# disable directory browsing
Options All -Indexes

# prevent basic url hacking stuff
# from: http://www.queness.com/post/5421/17-useful-htaccess-tricks-and-tips
RewriteEngine On
# proc/self/environ? no way!
RewriteCond %{QUERY_STRING} proc/self/environ [OR]
# Block out any script trying to set a mosConfig value through the URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
# Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
# Block out any script that includes a <script> tag in URL
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=|[|\%[0-9A-Z]{0,2})
# Send all blocked request to homepage with 403 Forbidden error!
RewriteRule ^(.*)$ /index.htm [F,L]

ErrorDocument 401 /backup/index.htm
ErrorDocument 403 /backup/index.htm
ErrorDocument 404 /backup/index.htm
ErrorDocument 500 /backup/index.htm
Dadurch werden Zugriffe auf bestimmte Dateitypen (auch die Backup Dateien), Verzeichnisse und Zugriffe mit sicherheitskritischen Merkmalen unterbunden. Alle diese nicht validen Zugriffe bekommen die index.htm serviert, welches einfach nur eine leere HTML Datei ist. Somit wird den Abfragenden auch kein detaillierter Grund gegeben, warum der Zugriff fehlschlug.

Automatisierung mit All-Inkl Cronjobs

Zu guter Letzt hilft diese Sicherungslösung natürlich nur, wenn sie automatisiert wird. Auch dies ist stark abhängig von eurem Hoster, System, dem Anwendungsbereich usw.
Im Falle von All-Inkl als Webhoster, könnt ihr die Cronjob Funktionalität im KAS (KAS -> Tools -> Cronjobs) benutzen:

ACHTUNG: Richtet euch den Cronjob bitte für die init-backup.php ein, nicht für die backup.php. Siehe Update von 03/2020 oben.
Das Bild zeigt die Cronjob Einrichtungsoberfläche von All-Inkl

106 Kommentare

  1. Ich danke viel viel mals, danach habe ich gesucht und lange gesucht. Endlich gefunden. Du erklärst sogar alles genau bei dem Anbieter bei dem ich auch bin All inkl.

    ich werde mir deinen Beitrag schnappen und ein Review drüber schreiben da ich dein tool bzw script genial finde thanks.

    1. Vielen Dank für die Bereitstellung des Scripts, leider kommt es beim Aufruf zu folgender Fehlermeldung (Hoster: All-Inkl, PHP 7.014):

      Parse error: syntax error, unexpected ‚<', expecting end of file in /www/htdocs/xxxx/backup/backup.phpx on line 331

      Danke im Voraus für Deine Hilfe und LG.

      1. Hallo Peter,

        unerwartetes Dateiende. ich vermute, dass beim kopieren oder übertragen des Scripts etwas schief gelaufen ist.

         

        Prüfe mal mittels webftp-Zugang den Inhalt des hochgeladenen Scriptes und ersetze diesen ggf. mit dem kompletten Script-Inhalt von oben.

         

        Gruß Chrunchy

  2. Hallo Guido, das sollte natürlich nicht passieren. Ich kann mich voraussichtlich erst Ende der Woche darum kümmern, werde aber den Fehler versuchen nachzuvollziehen und zu beheben. Kannst du mir bitte nochmal die komplette Fehlermeldung inklusive Screenshot schicken und an welcher Stelle der Fehler aufgetreten ist?
    Danke

  3. Hallo Guido,

    ich habe bei mir das Backup nochmal seperat eingerichtet, um es zu testen. So der Ablauf:

    1. Neues FTP-Verzeichnis: [root]/backup/test/
    2. backup.phpx Datei erstellt und den Code aus diesem Artikel 1:1 reinkopiert
    3. Folgende Stellen im Code angepasst:
      $ftpFoldersToBackup = array(„dev___test“, „feed2___test 2″);
      $copyToExternalFtp = 0;
      $backupMysqlData = 0;
      $dir = $pfad.“backup/test/“;
    4. Gestartet…

    Ich kriege da also kein Fehler. Damit würde ich den Fehler bei deinem Code oder Hoster vermuten.
    1.) Zeig mir mal bitte deine Zeilen 360-370 mit 365 fett markiert.
    2.) Bei welchem Hoster bist du?

    LG

  4. Also schauen wir mal:

    Neues Verzeichnis im root – hab ich
    code original aus

    http://hannes-schurig.de/09/06/2015/backup-loesung-fuer-ftp-und-mysql-in-php/

    raus kopiert

    in eine leere phpx reinkopiert

    Code angepasst:

    // ########## EDIT HERE ###################
    // ### FTP Data
    // which root folders should get backed up? comment is optional
    // format: „foldername___comment“
    // or: „foldername“
    $ftpFoldersToBackup = array(„test“);
    $copyToExternalFtp = 0; // copy new backup files to external ftp server? should be 1/“yes“/“ja“ or 0/“no“/“nein“
    // external (ftp) servers to copy new backups to, format:
    // in general: ftp://username:password@url:port/path (port is required!)
    // ftp://user:pw@ftp.server.com:21/
    // ftp://user:pw@serverurl.com:21/optional/path
    $externalFtpUri = „ftp://admin:password@barketing.dns.com:21/Data/FTP-Backups“;
    // ### MySQL Data
    $backupMysqlData = 0;
    // one or more databases of the local mysql server to backup, multiple data combined with „___“, comment is optional
    // format: „dbName___dbUser___dbPassword___comment“
    // or: „dbName___dbUser___dbPassword“
    $databasesToBackup = array(
    „d01ce064___d01ce064___password___main website DB“,
    „d01d7131___d01d7131___password“
    );
    // ### Mailing Data
    $sendMail = 0; // send notification mail when all backups are done – should be 1/“yes“/“ja“ or 0/“no“/“nein“
    $mailTo = „schurigh@gmail.com“; // valid mail address to send the mail to
    $mailSubject = „Automatische FTP Sicherung abgeschlossen“; // mail subject
    // additional mail annotations that gets inserted after the main mail content
    $mailAdditionalNotes = „Hiermit kann – wenn gewünscht – zusätzlicher Text in die Mail eingebaut werden.“;
    $mailBackupDetails = 1; // send information about successful backup files? should be 1/“yes“/“ja“ or 0/“no“/“nein“
    // ### General Options
    $backupFileMaximum = 2; // how many archives should be stored?
    $dir = $pfad.“test/“; // in which subfolder is this backup php file? this would be: „root/backup/“
    // ######### STOP EDITING HERE ###################

    Gestartet…….

    Sofort Fehlermedung:

    Parse error: syntax error, unexpected ‚[‚ in /www/htdocs/w007d6c2/backup/backup.php on line 365

    Die Zeile 365 ist die Originalzeile aus Deinem Skript

    pathinfo($file)[„extension“] == $fileType &&

    Gehostet ist die Kiste bei all-inkl.de

    LG

  5. Hallo Hannes,
    erst mal vielen Dank für deine Scripte auf der Seite. So was habe ich gesucht und zum Glück bei dir gefunden. Mein Hoster ist auch all-inkl, daher kann ich die gut gebrauchen. Ich habe nur jetzt nur Probleme, das backup script läuft nicht ganz und bei der kompletten htaccess habe ich Probleme.

    Backscrip hat bei der Datenbank folgenden Fehler:

    Warning: exec() has been disabled for security reasons in

    Und bei der kompletten htaccess:

    AuthType Basic
    AuthName "Backups"
    AuthUserFile "/www/htdocs/mein account/backup/.htpasswd"
    Require valid-user
    #block access to certain file types
    <FilesMatch ".(htaccess|htpasswd|ini|phps|log|sh|tar.gz)$">
     Order Allow,Deny
     Deny from all
    </FilesMatch>
    
    # disable directory browsing
    Options All -Indexes
    
    # prevent basic url hacking stuff
    # from: http://www.queness.com/post/5421/17-useful-htaccess-tricks-and-tips
    RewriteEngine On
    # proc/self/environ? no way!
    RewriteCond %{QUERY_STRING} proc/self/environ [OR]
    # Block out any script trying to set a mosConfig value through the URL
    RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]
    # Block out any script trying to base64_encode crap to send via URL
    RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
    # Block out any script that includes a <script> tag in URL
    RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
    # Block out any script trying to set a PHP GLOBALS variable via URL
    RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
    # Block out any script trying to modify a _REQUEST variable via URL
    RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})
    # Send all blocked request to homepage with 403 Forbidden error!
    RewriteRule ^(.*)$ /index.htm [F,L]
    
    ErrorDocument 401 /backup/index.htm
    ErrorDocument 403 /backup/index.htm
    ErrorDocument 404 /backup/index.htm
    ErrorDocument 500 /backup/index.htm

    habe ich immer folgenden Fehler:

    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator,

    Kannst du mir vielleicht weiter helfen?

    Danke dir

    LG

    Stingrays

  6. Hallo,
    da bin ich dann noch mal. Hast recht vielleicht ist ja noch jemand blind und macht nicht alles genau nach Anweisung.

    In deinem Script habe ich keine Fehler gefunden, sondern ich habe den Fehler begangen und die Seite nicht backup.phpx genannt sondern backup.php und das ist bei allinkl falsch, wenn man exec() nutzen möchte. Sonst habe ich jetzt alles umgesetzt was in deinem Script steht und auch die .htaccess habe ich so eingerichtet und bis jetzt kommt keine Fehlermeldung. Klappt alles bestens auch das mit SyncBack. Bin begeistert denn das erspart mir eine Menge Arbeit und Zeit.

  7. Hallo Hannes,

    vielen Dank für Deine Backup-PHP Scripte.

    Ist es mit Version 1.2 Deines Scriptes auch möglich, den kompletten Webspace zu sichern?

    in Zeile 040 Deines Scriptes werden die einzelnen Folder

    $ftpFoldersToBackup

    definiert.
    Gerne möchte ich jedoch alle Folder „root/*“ auf meiner Seite sichern, mit Ausnahme der unter Zeile 105

    $ignorieren

    definierten Folder.

    Wie/was muss ich hierzu anpassen?

    Da ich die Option

    $CopyToExternalFTP

    deaktiviert habe, ist es möglich, in Deiner Beachrichtigungsemail
    welche beim erfolgreichem erstellen der Backups per email versandt werden, die Dateinamen auf die tatsächlichen Backupdateien zu verlinken? So dass beim anklicken dieser Links ein Download dieser Files nach Authentifizierung erfolgen kann?

    Zu guter letzt: Werden die Datenbankdumps auch per FTP übertragen? Wenn die Option

    $CopyToExternalFTP

    aktiviert wurde?

    Viele Grüße
    Martin

  8. Also, ich hab mich mal kurz hingesetzt und zwei Ergänzungen programmiert: alle Root-Ordner sichern sowie Excludes ermöglichen.

    Hier nur die Änderungen, die du in deinem Script einbauen kannst; im Artikel ist der Code ebenfalls aktualisiert.

    Vor

    $ftpFoldersToBackup = array("reports", "tools___selfhosted seo tools");
    

    einbauen:

    // if backupAllRootFolders is 1, ftpFoldersToBackup will be ignored and all root folders will be backed up
    // folders in excludeFolders will be ignored while ALL-BACKUP
    $backupAllRootFolders = 0;
    $excludeFolders = array("bonnie");
    // if backupAllRootFolders is 0, you can specify multiple folders in ftpFoldersToBackup to backup
    

    Vor

    foreach ($ftpFoldersToBackup as $folderData) {
    

    einbauen:

    if ($backupAllRootFolders==1) {
    $ftpFoldersToBackup = array_filter(glob($pfad."*", GLOB_ONLYDIR));
    $ftpFoldersToBackup = preg_replace('/(/www/htdocs/w+/)/', '', $ftpFoldersToBackup);
    if (isset($excludeFolders))
    $ftpFoldersToBackup = array_diff($ftpFoldersToBackup, $excludeFolders);
    }
    

    Die Sachen mit dem verlinkten Text in der Mail hätte jetzt eine größere Umprogrammierung einer Funktion benötigt. Wenn du möchtest, kannst du dich gerne selber damit beschäftigen,

    function backupDetails($backups)

    enthält den Code, der dann sowohl in die Mail als auch in den HTML Bericht beim direkten Aufruf der .phpx eingefügt wird. Dort müsste man es bei

    $backupDetailsText .= "<td style='padding:1px 13px 1px 0px;text-align:left;'>" . $backups[$i][$j] . "</td>";

    irgendwie reinfriemeln aber dafür muss man die Schleifen ändern, die Spalten analysieren, die Datei-/Ordner-Pfade mit in das Array geben usw. – also einige Änderungen, die ne Weile dauern. Sorry.

    LG

  9. ich hoffe es klappt wäre geniale lösung

    eine frage zu diesem ftp external backup i habe einen qnap nas und die ddns ist myqnapcloud.com

    ich denke ich habe alles richtig wie kann ich das aber testen ob es funzt ???

    und ich möchte gerne die datenbanken sichern aber ich muss nirgends login oder so etwas eingeben macht das script das automatisch ? bin auch auf all inkl

    und bei ordner strutur die so lautet:
    root/backup1/backup2
    er sichert den ordner backup1 aber auch die unterordner mit datenbank ?

  10. irgend etwas stimmt mit dem zusatz für die htaccess nicht. wenn ich diesen einfüge beomme ich sofort einen 500 server error.

    wenn ich die htaccess via all inkl verzeichnis schutz erstelle funktioniert alles sofern ich den zusatz mit einbaue geht es nicht.

    außerdem backupt das script leider nur 2 datenbanken ich habe aber um die 20 datenbanken wo kann da der fehler sein?

  11. wenn man aus den kommentaren den code der htaccess nutzt geht es

    AuthType Basic
    AuthName "Backups"
    AuthUserFile "/www/htdocs/mein account/backup/.htpasswd"
    Require valid-user
    #block access to certain file types
    
    Order Allow,Deny
    Deny from all
    
    
    # disable directory browsing
    Options All -Indexes
    
    # prevent basic url hacking stuff
    # from: http://www.queness.com/post/5421/17-useful-htaccess-tricks-and-tips
    RewriteEngine On
    # proc/self/environ? no way!
    RewriteCond %{QUERY_STRING} proc/self/environ [OR]
    # Block out any script trying to set a mosConfig value through the URL
    RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]
    # Block out any script trying to base64_encode crap to send via URL
    RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
    # Block out any script that includes a  tag in URL
    RewriteCond %{QUERY_STRING} (|%3E) [NC,OR]
    # Block out any script trying to set a PHP GLOBALS variable via URL
    RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
    # Block out any script trying to modify a _REQUEST variable via URL
    RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})
    # Send all blocked request to homepage with 403 Forbidden error!
    RewriteRule ^(.*)$ /index.htm [F,L]
    
    ErrorDocument 401 /backup/index.htm
    ErrorDocument 403 /backup/index.htm
    ErrorDocument 404 /backup/index.htm
    ErrorDocument 500 /backup/index.htm
  12. nach rumbasteln geht nun alles. einzig die datenbanken werden nicht gesichert. zwar werden 2 datenbanken gesichert ich finde diese aber weder in meinem kas.all… noch wo anders. und die datenbanken meiner webseiten werden nicht gesichert. warum ?

  13. war mein fehler also meine letzten koments können gelöscht werden

    aber ich habe dennoch einen fehler

    Stelle (FTPs über SSL - Port 21) Verbindung zu FTP Server hompii.myqnapcloud.com her...
    Verbindung hergestellt, Login erfolgreich, passiver Modus aktiviert, Verzeichniswechsel zu /Windows/backupweb/ erfolgreich.
    15 FTP Backups werden auf externen FTP kopiert...
    Kopiere FTP_adder_2016-03-20_211050.tar.gz (Größe: 68.9 MB MB) auf den FTP...
    
    Warning: ftp_put(): php_connect_nonb() failed: Operation now in progress (115) in /www/htdocs/sssb/backup/ftp-backup.phpx on line 545
    
    Warning: ftp_put(): Type set to A in /www/htdocs/ssssb/backup/ftp-backup.phpx on line 545
    Fehler beim Kopieren des Backups.
    Kopiere FTP_ansen_2016-03-20_211059.tar.gz (Größe: 73.7 MB MB) auf den FTP...
    
    Warning: ftp_put(): php_connect_nonb() failed: Operation now in progress (115) in /www/htdocs/sssb/backup/ftp-backup.phpx on line 545
    
    Warning: ftp_put(): Entering Passive Mode (192,168,1,122,219,152). in /www/htdocs/assb/backup/ftp-backup.phpx on line 545
    Fehler beim Kopieren des Backups.
    Kopiere FTP_comp_2016-03-20_211115.tar.gz (Größe: 21.1 MB MB) auf den FTP...

    was mag das sein ??

  14. Hallo bill,

    ich lösche für gewöhnlich keine solche Kommentare. Jeder Fehler, den ein Leser macht, kann auch von einem anderen Leser gemacht werden. Von daher wäre es hilfreicher, wenn du mir zu jedem deiner Kommentar kurz schreiben könntest, was das Problem war und wie du es dann gelöst hast. Irgendeine Codezeile nicht angepasst, eine Einstellung vergessen, was können die anderen Leser beachten, wenn sie die gleichen Fehler bekommen?

    Zu deinen letzten Fehlern: das scheint eher am FTP-Server, deiner Firewall oder der Server/NAS-Konfig zu liegen als am Code.
    Schau dir mal diese Artikel und diese Google Suche an. Vielleicht hilft dir das weiter.

  15. Also zu dem Fehler 1 mit den Datenbanken
    Lösung : die einzelnen Datenbanken müssen mit Name dB login dB password in den Code geschrieben werden. Sonst werden diese nicht gesichert die 2 Datenbanken die immer gesichert werden sind die Demo Datenbanken aus dem Script die existieren ja bei uns Usern nicht

    Fehler 2 htaccess
    Ich habe den Code der htaccess eines Kommentares genommen damit ging alles

    Außerdem cache löschen wenn man die htaccess erstellt hat Bülow inkognito Fenster aufmachen

    Fehler 3
    Ftp ich vermute auch das es an den Einstellungen meiner nas liegt weiß aber nicht wo ich dort was einstellen muss

    Fehler 4
    Unterordnen unterordnen
    Also Ordner in Ordner werden gesichert als der übergeordnetrn Ordner wäre toll wenn man dem Script sagen kann aus dem Ordner Tools sichere Ordner 1 aber nicht zwei oder 1 und 2 aber einzelne

    Das Script sichert bislang den gesamten Tools Ordner mit allem was drin ist

  16. Zu Problem 1:
    Ja natürlich müssen die 2 im Code enthaltenen Datenbanken gelöscht werden – das sollen ja nur Beispiele sein. Ich habe den Code im Artikel an der Stelle nochmal angepasst, damit das noch deutlicher wird.
    In den zwei Zeilen über diesen Datenbankangaben steht das Format aber extra nochmal als Gerüst:

    // format: "dbName___dbUser___dbPassword___comment"
    // or: "dbName___dbUser___dbPassword"
    

    Noch einfacher kriege ich das nicht beschrieben, glaube ich.

    Problem 2:
    Das lag wohl am Encoding des Blogbeitrags – HTML Entities wurden leider umgewandelt und so wurde aus “ ein ".
    Ich habe das korrigiert und jetzt müsste man es 1:1 kopieren können.

    Problem 3:
    Das kann ich dir leider nicht sagen. Das Sichern der Backups auf mein NAS (Synology) funktioniert problemfrei. Dort habe ich am FTP Protokoll damals aber auch ne Menge gefummelt.

    Problem 4: Du meinst du willst Datei- oder Ordnerausschlüsse beim Backup? Die Möglichkeit gab es bereits, sie war jedoch etwas versteckt. Ich habe die entsprechende Zeile in den Config-Bereich nach oben gezogen. In Zeile 53 stehen jetzt Komma-seperiert Datei- und Ordnermasken zum Ausschließen.

    LG

  17. also ich bekomme es einfach nicht zum laufen also die ftp verbindung

    es kommt immer : Stelle (FTPs über SSL – Port 21) Verbindung zu FTP Server hdddcloud.com her…
    Verbindung hergestellt, Login erfolgreich, passiver Modus aktiviert, Verzeichniswechsel zu /Windows/backddeb/ erfolgreich.
    15 FTP Backups werden auf externen FTP kopiert…
    Kopiere FTP_addddentskdddder_2016-04-18_200934.tar.gz (Größe: 69.1 MB MB) auf den http://FTP...

    Warning: ftp_put(): php_connect_nonb() failed: Operation now in progress (115) in /www/htdocs/w01ddddb/backup/ftp-backup.phpx on line 545

    Warning: ftp_put(): Type set to A in /www/htdocs/w01ddddd6b/backup/ftp-backup.phpx on line 545

    weiß einfach nicht was ich machen soll 🙁

  18. für alle die auch das problem haben wie ich, backupauf einen externen ftp ( mein QNAP NAS ) funktioniert nicht.

    Ich habe die funktion RTRR Zweiweg Synchronisierung des QNAP NAS genutzt.

    Dort wird direkt der FTP eingetragen von ALL INkl oder anderem FTP und die NAS zieht sich dann den Backup ordner.

    so schickt das script nicht auf den FTP sondern der NAS zieht sich den Ordner vom FTP

  19. ich noch einmal. was müsste geändert werden damit ich zwei backups anlegen kann. einmal wöchentlich undmonatlich.
    klar zwei cronjobs

    aber wie kann ich einen ordner erzeugen wo woche und einen monatliche backups drin sind?

    habe gerade im folder backup/backupmonatlich erstellt dort die phpx datei hinein kopiert. bekomme aber einen fehler das kein backup erstellt werden kann
    sicherlich wegen dem pfad wo trage ich den weiteren folder ein?

  20. Hallo Bill,
    das stimmt, wenn du den Dateinamen meinst. Dieser wird nur aus dem Datum gebildet:

    $archivName = "FTP_$folder".date('_Y-m-d_His').".tar.gz";

    Das Kommentar wird nur in die „Berichterstattung“ (Feedbacktext, E-Mail) eingebaut. Wenn du das auch im Dateinamen haben willst, ginge das in etwa so:

    var comment = explode("___", $folderData, 2)[1];
    $archivName = "FTP_$folder".date('_Y-m-d_His')."_".$comment.".tar.gz";

    (nicht getestet)
    Mit dem Kommentar bei den Datenbanken geht es ähnlich – mit explode trennst du die Bestandteile am „___“ auf und holst es es in den Dateinamen.
    LG

  21. Bzgl. des nachfolgendes Fehler:
    Parse error: syntax error, unexpected ‚[‚ in /www/htdocs/backup/backup.phpx on line 384

    Bei mir habe ich die Zeile wie folgt ersetzt:
    pathinfo($file, PATHINFO_EXTENSION) == $fileType &&

    Damit funktioniert es.

  22. Ich habe aber auch noch ein Problem,

    bei mir gibt es Verzeichnisse, welche gesichert werden sollen, wo ich mit dem 10 Minuten Script-Timeout nicht klar komme.

    All-inkl-Support sagt, ich könne versuchen vorm Timeout Ausgaben des Scriptes zu generieren.

    Es stehen eine Menge flush(); Anweisungen im Script, bei mir erfolgt die Ausgabe aber erst wenn das Script komplett durchgelaufen ist.

    Hat hier jemand eine Idee, wie ich das ändern kann?

  23. kann man irgendwie auch das script so erstellen das ich zum einen jeden tag db sicherung mache aber nur jede woche ein ftp ??

    bzw kann ich irgendwie zwei der backup scripts ausführen ich habs probiert aber irgendwie klappt das nicht so

    da ich es echt satt habe mit den ganzen backup plugins für wordpress die so wie so bei all inkl nie richtig funzen

      1. Hi Billy, entschuldige die späte Antwort. Es ist eigentlich ziemlich einfach, aber Weihnachten, Silvester… ich kam nicht recht dazu.

        Also, mit PHP kann man relativ einfach den aktuellen Tag rausfiltern – du kannst also vor einer FTP-Sicherung erst den Wochentag abfragen und abhängig von diesem FTP sichern oder überspringen.

        Vor Zeile 86 wird jetzt folgender if-else-Part eingefügt:

        [php]
        if (date(„N“, time()) != 3) {
        echo „Keine FTP-Sicherung an diesem Wochentag.
        „;
        } else {
        [/php]

        Nach dem else folgt die Zeile 86 im alten Code (die FTP Überschrift) und der FTP Bereich bleibt unverändert. Du brauchst dann noch eine geschlossene Klammer – im alten Code Zeile 175, mit den Zeilen oben drin Zeile 178. Die 3 im Code steht jetzt beispielhaft für Mittwoch, die Wochentage werden von Montag beginnend mit 1-7 nummeriert. Hier also die gewünschte Wochentag-Zahl eintragen und den Cronjob täglich ausführen, dann wird FTP 1x und SQL täglich gesichert. Auch FTP ließe sich mit den 3 Zeilen oben entsprechend anpassen.

        That’s it! 🙂

  24. hey das werde ich mal testen ^^.  und schickes neues template find ich gut. aber ungewohnt erstmal

     

    hab nur ein problem mit einem anderen backup plugin dort kann ich folgende archive auswählen zip
    tar
    tar gzip
    tar bzip2

    ich nutze zur zeit tar gzip leider wird im log oft angezeigt das der dateipfad zu lang ist und nicht gesichert werden kann.

    nun welches archiv kann man denn bei all inkl noch nutzen was einen längeren pfad zu lässt. ?  Du nimmst ja bei deinem script auch targzip da sollte ja dann der selbe fehler auftreten :(. das beduetet ja so viel ich habe nie ein 100% backup hmpf

     

  25. Hallo Bill, ich Blicke nicht ganz durch, du erwähnst noch ein zweites Backup Plugin und Probleme mit der Pfadlänge. Treten die Probleme bei meinem Script oder dem anderen Plugin auf?

    Ich habe bei all-incl bisher nur dieses Dateiformat genutzt, weil die von all-incl bereitgestellte Funktion, die das archivieren erledigt, das so anbietet. Ich weiß nicht, ob andere formate möglich sind. Aber vermutlich würde das das pfadproblem nicht lösen?

    Erkläre vielleicht nochmal etwas genauer.

    LG

  26. hey also leider geht das script seid einiger zeit gar nicht mehr bei mir und ich weiß nicht warum. es rödelt und rödelt doch nichts passiert. warte auf …. domainname

    also wegen zweitem backup ja ich nutze ein backup plugin in meinen wordpress installationen. dieses zeigt mir gerne mal ein fehler an das für gzip maximale länge der dateipfade erreicht wurde. meist sind das cache files. die dann in domain./plugins/namebackup/backupcache/sicherung/namebackupcache liegen und das ist mehr als 130 zeichen lang oder wie lang es maximal sien darf

    1. nun klappt es doch wieder dauert nur sehr lange.

      bekomme im log aber die folgende nachricht

      Notice: Use of undefined constant “_“ – assumed ‚“_“‘ in /www/htdocs/werecx6b/backup/ftp-backup.phpx on line 224
      
      Notice: Use of undefined constant “ – assumed ‚“‘ in /www/htdocs/w0dft76b/backup/ftp-backup.phpx on line 224
      
      Notice: Use of undefined constant sql“ – assumed ’sql“‘ in /www/htdocs/wcdgf76b/backup/ftp-backup.phpx on line 224
      Backup fertig: DB_d01xff33_2017-03-05_125716“_“billywpmanager“sql“ (Größe: 0.4 MB, Dauer: 3 Sekunden)
      Aufräumen der DB Backups…
      2 valide Backups dieses Ordners gefunden, 1 Backups sollen behalten werden. 1 Backups werden gelöscht:
      /www/htdocs/w0xdfgdfc76b/backup/DB_d01d5133_2017-01-23_012142“_“kickerchecker“sql“.gz wird gelöscht…
      Datei erfolgreich gelöscht.
      Backup für Datenbank d01d5133 abgeschlossen.
      
      1. Hallo billy,

        Dieser Dateiname macht mich stutzig…

        Backup fertig: DB_d01xff33_20170305_125716_billywpmanagersql

        Das sieht nach einer falschen Definition der Variable $archivName aus.

        Diese steht im original-Script in Zeile 122.

        Dort scheint bei dir etwas mit der Verkettung zwischen Text und Variablen nicht zu stimmen.

        HTH

         

  27. Hallo billy,

    ich kann leider aktuell keine Probleme feststellen. Ich habe die Scripts mal sichtbar ausgeführt (normalerweise macht das ja mein cron) und sowohl über den Browser als auch per Mail positives Feedback bekommen, siehe Screenshot.

    Komisch ist auch: Meine Zeile 224 ist leer. Zwischen 223 und 225 ist eine leere Zeile, obwohl ich sowas eigentlich selten mache. Was steht da bei dir?
    Meine Zeilen 222-226 sehen so aus:

    	echo "Größe: $sqlSize MB";
    } else {
     // hier Zeile 224
    	$backupTime = time() - $sqlJobTime;
    	if (is_int($backupTime)) {
    

    LG, Hannes

  28. Hallo Hannes,

    nach langer Suche bin ich auf dein Script für ein FTP und DB Backup gestoßen und es wäre fast perfekt wenn ich wüsste wie ich folgende kleine Änderung vornehmen könnte.
    Ich habe mehrere Webseiten, die im Ordner „seiten“ im rootverzeichnis liegen, also „root->seiten->Verschiedene_Webseitenordner“
    Dein FTP Script liegt bei mir im Verzeichnis „root->tools->ftp.phpx“
    Folgendes habe ich in deinem Script (Version 1.2.2) für mich angepasst:

    $dir = $pfad.“tools/“; // in which subfolder is this backup php file? this would be: „root/backup/“

    $ftpFoldersToBackup = array(„seiten/Webseite1“, „seiten/Webseite2“);

    Als Fehler spuckt er folgendes aus:

    Warning: filesize(): stat failed for /www/htdocs/w0xxxxxx/tools/FTP_seiten/Webseite1_2017-03-14_154903.tar.gz in /www/htdocs/w0xxxxxx/tools/ftp.phpx on line 132
    Fehler bei der Backup Überprüfung. Die Backup-Datei ist fehlerhaft oder nicht vorhanden.
    Verzeichnis-Sicherung fehlgeschlagen. Erstelltes Archiv ist fehlerhaft.

    Was funktioniert ist den gesamten root Ordner „seiten“ zu sichern, was ich allerdings nicht möchte.

    Meine Frage also ist, was ich ändern muss damit ich die Unterordner von root->seiten einzeln sichern kann?

    Ich bin auch bei All-Inkl.

    Vielen Dank

    PS.: Das Datenbank-Backup funktioniert perfekt :).

    LG,
    Daniel

     

    1. Hallo Daniel,

      wie im Kommentar zu sehen (bei mir Zeile 57)

      // which root folders should get backed up? comment is optional

      Kannst du nur rootfolder übergeben, keine bestimmten Unterverzeichnisse.

      Eine mögliche Lösung für dich wäre z.B. die Variable $pfad direkt auf dein Unterverzeichnis „seiten“ zu legen und dann alle rootfolder sichern.

      Ist nicht getestet, wäre aber ein Ansatz.

      Dazu musst du an zwei Stellen den Text anpassen:

      Aus „preg_replace(‚/(\/www\/htdocs\/\w+\/)…“

      Wird „preg_replace(‚/(\/www\/htdocs\/\w+\/seiten\/)…“

      Das ganze einmal bei der Variable $pfad und einmal bei der Variable $ftpFoldersToBackup.

      Hoffe das hilft.

      Wie gesagt, es ist ungetestet. Rückmeldung wäre aber nett.

      1. Hallo Chrunchy,

        danke für die Antwort und deine Lösung hat bei mir tatsächlich funktioniert.
        Die Backups der einzelnen Seiten werden jetzt immer einzeln angelegt so wie ich es wollte. 
        Die Backups werden zwar im Ordner „root/seiten/backups/“ gespeichert, weil ich es nicht hinbekomme, dass sie im ordner „root/backups/“ gespeichert werden aber das stört mich nicht weiters.

        Vielen Dank nochmals!

  29. also hier meine zeile von 221 bis 229

    echo „<br>########################################<br>“;
    echo „<strong>Datenbank $dbName wird gesichert…</strong><br>“;
    flush();
    $sqlFile = „DB_$dbName“.date(‚_Y-m-d_His‘).“_“.$dbComment.“.sql“;
    exec(„mysqldump -u ‚$dbUser‘ -p’$dbPassword‘ –quick –allow-keywords –add-drop-table –complete-insert –quote-names ‚$dbName‘ >$sqlFile“);
    exec(„gzip $sqlFile“);
    $sqlFilePath = $dir.$sqlFile.“.gz“;
    $sqlSize = round(filesize($sqlFilePath)/1000000, 1);
    if(!validateBackup($sqlFilePath)) {

     

     

    in der zeile 224 steht bei mir name und dazu eben der commentar $dbComment

     

    das habe ich hier aus den komentaren genommen. ich wollte einen kommentar mit an die zip hängen. macht das vll den fehler ???

     

    ich wollte halt in meinen db namen noch mein kommentar der db haben um gleich zu sehen welche datenbank es ist.

    das scheint den

    Notice: Use of undefined constant_“ – assumed ‚“_“‘ in /www/htdocs/werecx6b/backup/ftpbackup.phpx on line 224

     

    auszulösen. gibt es eine lösung ???

     

    achja ich hab das gefühl mein script sichert nicht immer. kann es sein das es nur sichert wenn etwas neu ist die db oder ftp ???

    1. Hallo billy,

       

      die Zeichen werden hier entweder umgesetzt, oder sie sind in deinem Script schon falsch.

      Solltest du wirklich im Script die Anführungsstriche unten haben, sowohl einfach, wie doppelt, so klappt das nicht.

      Nachfolgendes sollte aber gehen:

      $sqlFile = „DB_$dbName“.date(‚_Y-m-d_His‘).“_“.$dbComment.“.sql“;

      Gruß Chrunchy

        1. Möglicherweise macht der „date“-Parameter mitten drin aber auch unkontrollierte Ding.

          Stell doch um…

          $sqlFile = „DB_$dbName“.“_“.$dbComment.“_“.date(‚_Y-m-d_His‘).“.sql“;

          o.g. funktioniert bei mir. Zumindest wenn alles im richtigen Editoreingegeben wurde.

  30. hab das mal geändert tatsächlich waren die anführungszeichen oben sehr merkwürdige formatierung. leider zeigt mir das script nichts an oder bricht bei der hälfte einfach ab

     

    kann es sein das ich was mit htaccess falsch gemacht habe ? bei mir speert er den ordner backup dort drinnen liegt das .phpx script.

  31. Eine Anzeige habe ich auch nicht, wenn ich das Script im Browser ausführe. Das hat zwei folgen. Zum einen sieht man nicht was gerade passiert, zum anderen läuft das Script je nach Servereinstellung nur x Sekunden.

    Normalerweise soll die flush(); eine Ausgabe auslösen, das funktioniert aber wohl nicht.

    Bei mir läuft das Script am Ende auch ur sauber durch, wenn im Webspace php als Apache-Mod eingerichtet ist. Sobald php im CGI-Mod ausgeführt wird, bricht mein Script nach 600 Sekunden ab.  Dies ist eine Voreinstellung auf meinem Server.

    Im Apache-Mod läuft das Script zumindest als Cronjob aufgerufen komplett durch.

    htaccess sichert ja nur das Backup-Script vor einem ungewolltem Aufruf. Wenn du das Script starten kannst, ist htaccess korrekt eingerichtet. In dem Moment, wo du die Daten eingibst, und das Script startet, ist der Verzeichnisschutz innerhalb der aktuellen Session aufgehoben.

  32. Hallo Leute,

    sorry für die Codeprobleme – aus mir nicht bekannten Gründen, zeigt der Kommentar-Editor hier nicht mein Code-Plugin an, ich kann hier Code auch nur über die Tags des Plugins manuell einfügen. Gehe ich irgendwann nochmal an.

    Auch wenn das jetzt vermutlich geklärt ist, hier nochmal der Code kopierbar, für andere:

    flush();
    $sqlFile = "DB_$dbName".date('_Y-m-d_His').".sql";
    exec("mysqldump -u '$dbUser' -p'$dbPassword' --quick --allow-keywords --add-drop-table --complete-insert --quote-names '$dbName' >$sqlFile");
    exec("gzip $sqlFile");
    

    flush() spuckt eigentlich Ausgaben aus, das scheint aber vom Webhoster gesteuert zu werden. Es gab Zeiten, da hat das funktioniert. Das sollte eher kein Codeproblem sein.

    PHP execution time limits sind in der Tat problematisch, wenn man viel sichern will. Allerdings müsste das Problem verschwinden, wenn die Backups nichts manuell per URL-Aufruf gestartet werden, sondern automatisiert über einen cronjob des Webhosters, wie Chrunchy korrekt sagt.
    Im Gegensatz zum Aufruf durch einen Nutzer/via URL, hat PHP über CLI (Kommandozeile) meist keine Ausführungszeitlimits, also deaktiviert.
    Also testweise mal das Backupscript in All-Inkl als Cronjob eingerichtet, die Ausgaben per Mail schicken lassen und dann abwarten, vielleicht geht es dann von allein. Hier meine Einrichtung:
    All-Inklusive Backup Cronjob

    Ich denke auch nicht, dass htaccess da reinfunkt, wenn du da die Tipps im Beitrag soweit befolgt hast.

  33. bei mir funzt es leider immer noch mit cronjob. es schafft gerade mal 5 seiten die ftp dateien und das war es dann. es fehlen also ftp ordner und komplett die datenbanken :(. langsam weiß ich nicht mehr weiter.

    1. Hallo billy,

      ich kann dir anbieten mal einen Blick in das Script zu werfen, wenn du es zur Verfügung stellst.

      Vorher solltest du natürlich die Passwörter im Script entfernen.

      Bei all-inkl kannst du zu einem Cronjob eine Mailadresse angeben, wo die Ausgabe des Scripts hingesendet wird. Geht aus dieser Mail etwas hervor wworan es liegt?

      Gruß Chrunchy

    2. Hallo Billy,

      also bei mir läuft das Script sauber durch per cronjob. Laufzeit knapp 30 Minuten im Ergebnis sind es 3 Verzeichnisse mit knapp 14,8 GB Volumen in den Backup-Files.

      Ich fürchte, solange du hier keine Inhalte von den Mails bekannt gibst, wird es schwer die Ursache zu finden.

  34. wollte jetzt noch einmal alles neu erstellen  da stimmt aber was in deinem code nicht ^^.

    da sind irgendwie immer die 0 aus dem code raus zwei beispiel:

    $allFtpTime = ;
    $allSqlTime = ;

    dadurch bekomme ich immer syntax error

  35. wollte mich noch mal melden. nach neu laden der seite war alles korrekt

    das script läuft nun etwas weiter als früher aber immer noch nicht durch. sehr schade das ist merkwürdig das es nicht mehr richtig geht. früher ging alles.

    all inkl schreibt mir auf eine support mail. das das script hohe ausführzeit braucht, man aber nichts ändern kann

  36. kann mir jemand schreiben wie ich das script teile ?? also so das ich eben einmal 5 ftp und msql sichere und dann noch ein script habe was wieder 5 macht und immer so weiter?

    habe hier https://zoman.info/datenbank-und-webseitenbackup-mit-e-mail-benachrichtigung-und-downloadlink-bei-all-inkl-com eine möglichkeit gefunden nur 1ne db und 1 ftp zu sichern. das wäre mir aber zu wenig

  37. Billy, kriegen wir alles hin. Ich gucke mir nochmal den Code in meinem Artikel an, mein Code Plugin scheint keine gute Wahl zu sein. Notfalls lade ich das Script erstmal als Datei hoch, Download statt Code.

    Das Teilen ist doch auch recht easy. Du kopierst das Script, backup2.phpx, und packst dort die Projekte/Ordner rein, die in der backup1.phpx nicht drin stehen. Dann machst du ein cronjob für die erste und einen für die zweite Datei, mit ausreichend zeitlichem Abstand zwischen den Ausführungen. Bzw am 1. Des Monats Datei 1, am 2. Datei 2. Du kannst ja beliebig viele Backup Dateien haben, obwohl das natürlich Quatsch wäre, aber vom Prinzip.

  38. hallo billy,

    was hast du für eine Scriptlaufzeit bis zum „Abbruch“?

    Per Cron UND php im Apache-mod, gibt es bei all-inkl keine Beschränkung.

    Teilen geht am einfachsten, wenn du zwei Scripte mit hast, in denen du über den Verzeichnis-Ausschluß die zu sichernden Ordner angibst.

    Fehlende 0 im Script kann ich bestätigen, dabei ist mir aufgefallen…

    @ini_set(„max_execution_time“, 300);

    Den Wert hast du hoffentlich nach oben gesetzt, oder? Bei mir steht der auf 3600.

  39. Hey meine lieben wenn ich wieder nüchtern bin und zeit finde posten ich das Script mal als Datei. Ja Hannes mach es lieber als datei denke da kann man dann viele Fehler ausschließen. Code ist immer so eine Sache.

    In der Mail die ich bekomme steht nur welche verzeichnisse gesichert wurden. Das bricht manchmal sogar im Satz ab also sichere hack…. Ende.

     

    An die timeout habe ich auch schon gedacht hab mich aber nicht getraut das zu ändern. Werde also mal auf 3600 setzen

    Merkwürdig ist das es erst seid dem Umzug des Servers seitens all inkl nicht mehr funzt.

     

    Zur Not splitte ich das Script und lasse eben nur 3 4 Seiten sichern.

    Schön das hier noch so toll Menschen unterwegs sind. Wenn jetzt noch jemand bei ist der mir eine neue Idee für eine Website gibt dann wäre ich mehr als glücklich

  40. da bin ich mal wieder.

    hat sich leider nicht gebessert. selbst wenn ich weniger webseiten sicher, mal macht er 2 oder mal nur 1ne. aber nie die datenbanken so weit kommt es nicht.

    die ausführungszeit ist bei 3600 eingestellt. sehr merkwürdig das lief immer so gut und nun :(. werde da wohl eine andere backuplösung finden müssen

    1. Ich bin mir relativ sicher, dass es an der php-Version von deinem Hosting liegt.

      Sobald hier CGI/FPM im Spiel ist, läuft auch der Cronjob max. 10 Minuten.

      Abhilfe schafft hier nur eine Umstellung auf php im Apache Mod

        1. @Hannes, ich habe bei all-inkl einen kompletten Server gemietet.

          Ich weiß also nicht ob in einzelnen Domain-Paketen die php-Version ausgewählt werden kann.

           

          Falls doch, ist die Auswahl in der Domain-/Subdomain-Verwaltung zu finden.

          Dort gibt es eine Möglichkeit die php-Version auszuwählen. Zumindest bei mir.

        2. Danke fürs Feedback Chrunchy. Ich habe auch nochmal nachgesehen und kann bestätigen: Auch im normalen Webhosting lässt sich pro (Sub)Domain die PHP Version in den Einstellungen der Domain festlegen. Neu erstellte (Sub)Domains haben immer die aktuellste stabile Version zu diesem Zeitpunkt ausgewählt. Außerdem kann mit dem htaccess Befehl AddHandler x-httpd-php7.0 .php die PHP Version auf Verzeichnisebene steuern. Noch genauer lässt es sich auf Dateiebene mit Dateiendungen steuern, indem die Datei einfach statt .php die Endung .php70 bekommt. Es lässt sich also recht flexibel konfigurieren, um Konflikte zu vermeiden.

  41. Nur um hier unnötige Verwirrungen zu vermeiden…

    php 7.0 läuft im cgi-Modus und hat damit auch im Cronjob eine maximale Laufzeit von 10 Minuten.

    Wenn das nicht reicht, muss auf eine ältere Version umgestellt werden.

    Bei mir ist aktuell die Version 5.5 noch als apache-Modul auszuwählen. Damit gibt es im cronjob, zumindest bei mir, keinen timeout seitens des Servers, außer die im Script angegebene Laufzeit wird überschritten. Die kann man aber anpassen.

  42. Hallo Hannes,

    ich bin per Zufall auf Dein tolles Skript gestoßen, es verursacht bei mir aber laufend Fehler.
    Weiter oben hat mal jemand geschrieben, dass das Code-Plugin Fehler verursacht.

    So auch bei mir. Aktuell habe ich z.B. folgendes rauskopiert (inkl. Angabe der Zeilennummer):

    28: $allFtpTime = ;
    29: $allSqlTime = ;

    Damit bekomme ich Fehler. Wenn ich 0 eintrage, dann kommen die nächsten Zeilen mit Fehler… Alles in allem habe ich es nicht zum Laufen gebracht, was ich sehr schade finde.

    Könntest Du vielleicht Deinen Code auch als Download anbieten? Das wäre große Klasse!

    1. @HarryPhone,

      da wird doch nur 2 Variablen ein Wert zugeordnet, das sollte keine Fehler produzieren.

      Setzte die Zeilen mal wie folgt:

      $allFtpTime = 0;

      $allSqlTime = 0;

      Allerdings stelle ich gerade fest, dass auf diese Variable nie zugegriffen wird. :-0

      @Hannes, wofür ist die gut?

       

      1. OK, habe gerade etwas kurioses festgestellt.

         

        Es ist fatal, wenn man oben im Artikel auf „Code anzeigen“ klickt und den Quellcode dann im Browser markiert um diesen zu kopieren. Dabei gehen einige Nullen (0)  verloren, was mit Sicherheit zu Fehlern führt.

        So sieht auch der Code von HarryPhone aus.

        @HarryPhone, bitte den Quellcode nocheinmal wie folgt kopieren:

        1. oben im Artikel „Code anzeigen“ anklicken

        2.  oberhalb des Codes erscheint eine graue Zeile, darin das dritte Icon von recht (kopieren) anklicken.

        3. mit STRG-C den markierten Teil in die Zwischenablage befördern.

        4. mit STRG-V in den eigens favorisierten Texteditor einfügen und die Datei speichern.

        Damit sollten die Fehler weg sein, weil alle Informationen im Quelltext drin sind.

        HTH

  43. Hallo zusammen,

    danke! Jetzt hat alles funktioniert. Beim Kopieren der .htaccess habe ich mich an Chrunchys Anleitung gehalten nachdem ich auch hier Fehlermeldungen beim einfachen Kopieren erhalten hatte. Dieses Code-Plugin scheint leider ziemlich buggy zu sein.

    Einen Wunsch hätte ich noch: Die Absender-E-Mail-Adresse als Variable zum Einstellen.

    Hintergrund: Ich verwende z.B. den MySQLDumper zum Sichern der Datenbanken (was ja nicht nötig wäre, da es Dein Skript ja auch könnte, aber der MySQLDumper läuft ja schon und man kann zusätzlich direkt die Datensicherung einspielen). Und jetzt bekomme ich E-Mails von unterschiedlichen Absendern für die Datensicherung. Da wäre es natürlich schöner, das Ganze zu vereinheitlichen…

    In jedem Fall vielen Dank für das tolle Skript. Besonders die FTP-Funktion ist super. So ist man auch abgesichert, wenn beim Hoster alles abfackelt.

    1. Absenderadresse als Variable ist kein Ding…

      Zeile, bei mir 339

      "From: backupscript@{$_SERVER['SERVER_NAME']}\r\n" . "Reply-To: backupscript@{$_SERVER['SERVER_NAME']}\r\n" . "Content-Type: text/html\r\n"

      Ersetzen durch

      "From: ".$mailFrom."\r\n" . "Reply-To: ".$mailFrom."\r\n" . "Content-Type: text/html\r\n"

      Vorher die Variable analog zu $mailTo definieren, bei mir z.B. ab Zeile 84

      $mailFrom = "backupscript@domain.tld";

      Jetzt hoffe ich nur der Editor baut nicht wieder Mist.

        1. Hab den Code mal korrigiert. Anderen Editor/Kommentar-Editor/Code-Plugin habe ich alles noch auf der Liste :-/
          PS: Welchen Kommentar-Editor und welches Code Plugin nutzt ihr denn so?

  44. @Hannes, Danke.

    In Sachen Editor und Plugins bin ich raus, betreibe keine derartige Seite wo so etwas benötigt wird. Hoffe aber du findest eine Lösung, gerade wo es hier immer mehr um Teile des Quellcodes geht, wäre das sicher hilfreich.

  45. Hallo Hannes,
    danke für dein tolles Script!!
    Eine Frage hätte ich dazu, die durch mein Nextcloud Datenverzeichnis ergibt: Gib es eine Möglichkeit die Größe der einzelnen Archivdateien zu splitten, sodass bei Bedarf mehrere Files erzeugt werden, falls die maximale Filegröße überschritten wird?
    Danke, Manfred

    1. Hallo Manfred! Freut mich, dass du das Skript verwenden kannst. Zum Splitting wurde ich schonmal gefragt und hatte schonmal ein Brainstorming und Draft zusammengetippt, siehe diesen Kommentar. Das ist aber nicht ausprogrammiert und muss daher erst gemacht werden. Solltest du das zu Ende programmieren, gib mir gerne Bescheid, würde das dann gerne mit in die finale Version einbauen.
      LG, Hannes

  46. Ich bekomme das Skript zum Laufen und es legt auch die Sicherungen an.
    Auf dem Server läuft aber php 7.1 und es kommt damit folgende Warnmeldung:

    Warning: A non-numeric value encountered in …… backup.php on line 425

    So sieht die Zeile aus:
    $mailText += „Die automatische Sicherung hat „.count($backupFiles).“ Datensätze (Verzeichnisse/Datenbanken) in insgesamt $backupTime Sekunden gesichert.“;

    Wer hat eine Idee was hier falsch ist?

    Danke, FranK.

    1. Hallo Frank. Mit PHP 7.1 wurde eingeführt, dass uninitialisierte Variablen beim Abrufen eine Warnung werfen, das war vorher nicht so. Das wird vermieden, indem die Variablen entweder vorher irgendwie gesetzt oder mit einem beliebigen Wert initialisiert werden. Die Variablen $backupFiles und $backupTime werden hier benutzt. Normalerweise müsste mein Skript zum Zeitpunkt der Mailerstellung diese beiden Variablen bereits mit irgendeinem Wert versehen haben, beide Werte (Dateianzahl und Backupzeit) werden vorher gesetzt, wenn ein Backup erfolgreich durchlief. Ich vermute also mal, dass bereits vorher etwas beim Backup nicht funktionierte.
      Du kannst dir die Variableninhalte mal mit var_dump($backupFiles, $backupTime); ausgeben lassen, dann weißt du schonmal, welche Variable Schuld ist und wo der Fehler liegen könnte. Wenn backupFiles undefined ist, dann hat beim Auslesen der zu sichernden Ordner etwas nicht geklappt. Wenn Letzteres undefined ist, war der tatsächliche Backupvorgang (ca. ab Zeile 120) wohl nicht wie erwartet. Schau auch mal ins FTP, ob du dort vielleicht schon erstellte Archive findest.

      1. Hallo Hannes,
        das Backup funktioniert ganz normal und die Archive werden sowohl für Dateien als auch Datenbanken angelegt. Es ist wohl eher eine kosmetische Warnung, die aber irritieren könnte…

        https://stackoverflow.com/questions/42044127/warning-a-non-numeric-value-encountered

        New E_WARNING and E_NOTICE errors have been introduced when invalid strings are coerced using operators expecting numbers or their assignment equivalents. An E_NOTICE is emitted when the string begins with a numeric value but contains trailing non-numeric characters, and an E_WARNING is emitted when the string does not contain a numeric value.

  47. Hallo Hannes,

    vielen Dank für Deinen Einsatz hier auf Deiner Website und den supertollen Service den Du hier bietest! Wie mein Vorredner (Frank) schon festgestellt hat, kommt es ab PHP 7.1 zu den Warnmeldungen.

    Mir ist nun zusätzlich aufgefallen, dass bei ALL-INKL.COM, unter aktuellen Serverumgebungen, die PHPX-Dateien nicht mehr laufen (Unsupported PHP Version). Das Script muss nun entweder PHP71, PHP72 etc. oder einfach nur PHP lauten (entsprechende PHP-Voreinstellung vorausgesetz), dann läuft alles. Nur halt, mit entsprechendem Warnhinweis.

    Viele Grüße!

    1. Hallo Anonym,
      das stimmt, mein Skript läuft auch schon seit Längerem als PHP, der Cronjob somit auch. Hab ich hier noch gar nicht aktualisiert.
      Die Warnungen kann man vermutlich beheben, wenn man das Text-Variablen-Mischmasch in backupSummary mal ordentlich macht oder den @error_reporting(E_ALL) Scope anpasst, beispielsweise auf @error_reporting(E_ERROR | E_PARSE | E_NOTICE); – dann kommen keine Warnungen mehr.

      1. Hallo Hannes,

        vielen Dank für die rasche Antwort. Das Script zu verfeinern wäre dann wohl eher was für die Spezialisten hier unter Euch. Oder Du schreibst mal ein Update das Artikels wenn es Deine Zeit zulässt 😉 Werde Deinen Blog gerne weiter beobachten!

        Viele Grüße!

        1. Yes, I know, müsste man mal machen 😉
          Ich hab gestern nochmal kurz geschaut aber auf den ersten Blick weiß ich nicht, woran genau er sich da stört. Ich denke mal kurz drüber nach, vielleicht kann ich das fixen.
          Schau gerne weiterhin vorbei und wenn du was skript-/coding-mäßiges brauchst, sagste Bescheid. Meist wird aus Nutzeranfragen dann direkt ein neuer Blogartikel 😉
          LG!

  48. So, nach dem letzten Server-Update bei All-inkl gibt es keinen apache-mode für php mehr.

    Das heisst die Laufzeit ist auf 10 Minuten begrenzt.
    Hier hilft dann nur der Umweg über eine Initialisierung des Updates via php-Datei mit etwa folgendem Inhalt.
    [code]
    &1″, $out, $result);
    echo „Returncode: “ .$result .““;
    echo „Ausgabe des Scripts: “ .““;
    echo „“; print_r($out);
    ?>
    [/code]
    Wobei „backup-webspace.php“ der Name dieses Scripts ist und es sich im selben Verzeichnis wie das Init-Script befindet. Im Cronjob muss dann natürlich das Init-Script aufgerufen werden.

    Damit wird der Timeout von 10 Minuten für ein Cronjob umgangen.

    Gruß Chrunchy

  49. Hallo und Danke für die viele Arbeit!

    Ich scheitere leider bereits beim Aufruf des Scripts:
    PHP version not supported
    The requested PHP version is not supported on this server.
    ————————————————————————
    Die gewählte PHP Version ist auf dem Server nicht verfügbar.

    Egal ob PHP 7.2, 3 oder 4 – es kommt immer der selbe Fehler.

    Was mache falsch?

    Danke und Gruß
    Olly

  50. Hallo,

    da All-Inkl.com mittlerweile seine Server auf Ubuntu 18 betreibt, dürfen die Scripte nur noch xyz.php (ohne x am Ende) benannt werden.

    Ich bekomme beim Scipt-Aufruf folgende Fehlermeldung:
    [0] => PHP Warning: Use of undefined constant d12345a6___d12345a6___V00ZbGw0ZNYWwH0Z___Projekt – assumed ‚d12345a6___d12345a6___V00ZbGw0ZNYWwH0Z___Projekt‘ (this will throw an Error in a future version of PHP) in /www/htdocs/z00a0gc0/backup/backup.php on line 68
    [1] =>
    [2] => Warning: Use of undefined constant d12345a6___d12345a6___V00ZbGw0ZNYWwH0Z___Projekt – assumed ‚d12345a6___d12345a6___V00ZbGw0ZNYWwH0Z___Projekt‘ (this will throw an Error in a future version of PHP) in /www/htdocs/z00a0gc0/backup/backup.php on line 68
    [3] => 06.06.2020 13:49:27

    Das Backup wird aber erstellt.
    Was sollte wie geändert werden, damit es ohne Warnhinweise durchläuft?

  51. Hallo Hannes,
    als erstes ein herzliches Dankeschön für das Script, das inkl. Cronjob auf Anhieb lief. Ist ja auch wirklich gut dokumentiert!!
    Und heute stehe ich nun vor der Aufgabe, dass ich ein Restore von einem Ordner samt Unterordner und einer Datenbank machen muss. Sozusagen also den zweiten Teil eines kompletten Backzp/Restore Vorgang.
    Ich hatte frecher Weise auf ein Restore.php als Pendant zum Backup.php gehofft. Gibt es wohl leider nicht. Aber vielleicht ist es eine Anregung…

  52. Erstmal Danke für die Arbeit. Funktioniert sehr gut.

    Ein paar Gedanken…

    Kann man eine Verschlüsselung einbauen (vorausgesetzt mit den Binarys bei all-inkl geht das)
    Wäre für eine (S)FTP Kopierung auf einen Server den ich nicht voll kontrollieren kann ganz praktisch.

    Eine SMTP Funktion wäre ganz nett, das PHP-Mailing ist immer so eine Sache.

  53. Hallo Hannes, vielen Dank für dein tolles Script. Leider bekomme ich eine Fehlermeldung mit Verweis auf die Zeile 130 der backup.php: Warning: filesize(): stat failed for …..
    Das Backup lädt zwar, aber die Fehlermeldung irritiert mich. Hast Du da eine Idee?
    LG Jan

    1. Hi,
      ich stehe vor dem gleichen Problem. Ebenfalls Zeile 130 Warning: filesize() etc.
      Es wird zwar ein Backup erzeugt, aber scheinbar wird dann mit Fehler abgebrochen.

      Gibt es hier eine Lösung?

  54. Hallo Hannes,

    wo finde ich denn die V1.3? Im Download ist „nur“ die V1.2.2 und mit der komme ich leider so überhaupt nicht zurecht, da ich nicht erkenne, wo ich nun die Daten der Datenbank oder die FTP-Parameter eintragen soll und wie…

    Die V1.1, mit der ja nur FTP gesichert wird, läuft einwandfrei. Nur ist diese im Aufbau anders als die V1.2.2, so dass man auch nicht einfach mit Copy/Paste die Daten rüberkopieren könnte.

    Und die Option, auch die Datenbank auf diese Weise nicht nur zu sichern, sondern zusätzlich extern auf einem FTP-Server abzulegen, ist grandios und Gold wert.

    Bitte daher nochmal für einen absoluten Script-Dummy erläutern, wo genau die Daten reingepackt werden müssen. Danke

Schreibe einen Kommentar