17
Tags:
php
mysql
dropbox
Skrevet af
Bruger #8773
@ 23.05.2011
Anvendelse
Nu har vi gennemgået hvordan koden er bygget op, og vi mangler nu blot anvendelsen af koden.
Til dette formål, har jeg valgt at anvende min index.php fil.
Selve det at tage en backup er meget simpelt når vi har været grundige med vores php klasse.
Vi starter med at initialisere et objekt af typen DatabaseBackup hvori vi angiver vores data for at kunne tage en backup.
Jeg har i kodeeksemplet herunder vist hvordan man gør når det skal uploades til Dropbox.
- require_once("DatabaseBackup.class.php");
- $backup = new DatabaseBackup("backups",DROPBOX,"my@email.com","my-secret-password", "Database Backups");
Jeg har altså valgt at mine backups skal placeres i en mappe på serveren kaldet "backups" (den vi lavede tidligere), mine backups skal uploades til Dropbox-kontoen tilhørende "my@email.com" som har koden "my-secret-password". I hans Dropbox skal hans backup placeres i mappen "Database Backups".
Vores klasse vil automatisk lave undermapper i denne mappe med månedens navne og backup-filerne inde i disse.
For at tilføje et par database til køen, gør vi som følger:
- $backup->addToQueue("localhost","database_username","database_password","mydb1");
- $backup->addToQueue("localhost","database_username","database_password","mydb2");
- $backup->addToQueue("localhost","database_username","database_password","mydb3");
Hvis MySql er sat op korrekt, og der tillades fjernadgang til MySql, kan du ogås tage backups på tværs af servere. Der skal du blot angive serverens URL eller IP i stedet for localhost. Hos Surfotwn er databasehosten på "mydbXX.surftown.com" (tjek i kontrolpanelet for at finde ud af hvilken server).
For at foretage backup'en, kalder vi blot
doBackup() metoden fra vores klasse:
- $backup->doBackup();
Nu har jeg testet at alle mine backups kører som de skal, og jeg har derfor ikke sat en if..else ind for at tjekke om backup'en rent faktisk lykkedes.
Ekstra sikkerhed og automatisk backup
Nu er der måske nogle af jer der sidder og tænker "Jamen Simon, det kræver jo at jeg besøger siden hver dag?" og "Jamen Simon, det fylder jo min Dropbox hvis alle og enhver bare kan starte min backup".
Begge dele er fuldstændigt korrekt, men det kan vi naturligvis gøre noget ved.
Til den første del, har jeg lavet et MD5 hash som jeg parser som parameter i URL'en når jeg vil lave en backup. Det vil altså sige at jeg tilføjer noget alá det følgende i min index.php:
- <?php
- $getHash = $_GET["hash"];
- $secretHash = "0080e4dfb9a344ecb9e95c6c5ae8355c";
- if($getHash==$secretHash)
- {
- // Tilføjer filer til køen og kør backup
- }
- ?>
På den måde skal du blot sørge for at det kun er dig selv der har adgang til denne side.
Til den anden del: ja, reelt set kan du sørge for at besøge siden selv hver dag, men det ved vi jo godt allesammen at man ikke gør. Man kunne selvfølgeligt vælge at sætte siden som sin startside, men på den anden side kunne man på den måde risikere at få en hel masse backups i løbet af dagen.
I stedet har jeg valgt at bruge et cronjob. Nogle webhoteller tilbyder cronjobs til deres kunder og andre gør ikke. Så vidt jeg ved, tilbyder Surfotwn ikke cronjob, og jeg måtte derfor ty til en gammel ven i stedet for:
www.cronjob.de.
Det er godt nok en tysk side, og mit tysk er ganske elendigt, men med lidt hjælp fra
Google Translate er det absolut intet problem at finde ud af.
Man sætter blot et cronjob op inde på siden, angiver hvor ofte man vil have det hvorefter man lige skal lave noget godkendelse af ens server ved at uploade en lille HTML fil.
Jeg har sat min egen backup til at køre hver dag kl. 00.01, og får derfor hver morgen når jeg tænder min computer besked om at 4 nye filer er blevet tilføjet til Dropbox - det hele kører bare som det skal.
Opsamling
Til slut kan vi altså konkludere at det ikke behøver være et kæmpe problem at få taget backup af sine databaser. Jeg kender en del udviklere der aldrig har taget backup af deres databaser tidligere fordi de manuelt skulle ind i phpMyAdmin kontrolpanelet for at eksportere deres .sql filer.
Med min klasse til at klare jobbet, slipper man for det problem, og kan blot læne sig tilbage og kigge på at serveren i samarbejde med et cronjob og Dropbox klarer det hele for dig.
Jeg har samlet hele koden herunder inklusiv dokumentation og copyright notits i toppen af koden:
- <?php
- /**
- * @file
- * Mysql Backup
- *
- * This script is made by Simon Smith - all rights reserved.
- * Feel free to use the code as you like, but make sure this top-note is kept
- * intact at all times.
- * Simon Smith has nothing to do with the Dropbox Uploader class. Information
- * regarding this can be found at http://wiki.dropbox.com/DropboxAddons/PHPDropboxUploader
- * If you like this code or if you have any feedback feel free to contact me
- * through my blog (in danish) at http://www.simon-smith.dk.
- * If you have any questions regarding this script or maybe suggestions for things
- * that I should change, feel free to cantact me through my blog (http://www.simon-smith.dk)
- * or directly at my email: simon@rosmi.dk. Make sure the topic is something
- * regarding this script so I know it isn't spam :-)
- * @author Simon Smith @link www.simon-smith.dk
- * @version 1.0
- */
- require_once("DropboxUploader.php");
- define('SERVER',1);
- define('DROPBOX',2);
- class DatabaseBackup{
- private $uploadTo;
- private $uploader;
- private $dropboxDir;
- private $uploadDir;
- private $queue = array();
- /**
- * Class constructer
- *
- * Receives arguments to be saved in local class variables.
- * The folder in which to place the backup, which is the first paramter,
- * must be given when initializing class. The rest of the parameters are
- * optional and must only be given if Dropbox upload is wanted.
- *
- * @param $uploadDir Defines the folder in which backup is saved
- * It's a good idea to protect this folder using a .htaccess file or
- * in other ways make sure that it can't be accessed publicly
- * @param $uploadTo Defines where to store backup, server or Dropbox
- * The default is SERVER (1). Change to DROPBOX (2) to store backup in
- * Dropbox. When performning the backup (doBackup()) you must decide
- * whether you want to delete files from server when backup finishes. This
- * is only necessary when using the Dropbox option.
- * @param $dropboxUsername Defines Drobox username
- * @param $dropboxPassword Defines Dropbox password
- * @param $dropboxDir Defines which folder within Drobox the files
- * should be saved in.
- */
- public function __construct($uploadDir,$uploadTo=SERVER,$dropboxUsername="",$dropboxPassword="",$dropboxDir="")
- {
- $this->uploadDir = dirname(__FILE__)."/".$uploadDir;
- if($uploadTo==DROPBOX&&$dropboxUsername!==""&&$dropboxPassword!==""&&$dropboxDir!=="")
- {
- $this->uploadTo = DROPBOX;
- $this->uploader = new DropboxUploader($dropboxUsername, $dropboxPassword);
- $this->dropboxDir = $dropboxDir;
- }else
- $this->uploadTo = SERVER;
- }
- /**
- * Add element to backup queue
- *
- * Call this funktion to add a database to the backup quere. Use the doBackup()
- * function to perform the backup.
- *
- * @param $host Defines the database host
- * @param $username Defines username for database
- * @param $password Defines password for database
- * @param $database Defines the name of the database
- * @return Returns false if all parameters wherent given
- * @todo add support for checking whether valid information was passed.
- * try to actually log in to database
- */
- public function addToQueue($host,$username,$password,$database)
- {
- if($host!==""&&$username!==""&&$password!==""&&$database!=="")
- $this->queue[] = array("host"=>$host,"user"=>$username,"pass"=>$password,"database"=>$database);
- else
- return false;
- }
- /**
- * Function for performing the actual backup.
- *
- * When calling this function the backup will start. It will perform backup
- * of every element in the backup queue.
- *
- * NOTE: the backup queue will NOT be emptied when backup has finished. To
- * perform another set of backups, create a new instance of this class and
- * add elements to a new queue
- * @param $deleteAfterBackup Default is true. This means that files
- * will be deleted when the backup has finished but only if the Dropbox
- * option has been selected.
- * @return Returns true if everything went as it should and false
- * if something went wrong somewhere. It doesn't check if the backup has
- * actually been made, just if something within the code went wrong.
- * @TODO Add option for emptying queue when backup has finished
- */
- public function doBackup($deleteAfterBackup=true)
- {
- if(count($this->queue)>0)
- {
- switch($this->uploadTo){
- default:
- case SERVER:
- foreach($this->queue as $i => $value)
- {
- $host = $this->queue[$i]["host"];
- $user = $this->queue[$i]["user"];
- $pass = $this->queue[$i]["pass"];
- $database = $this->queue[$i]["database"];
- $backupFile = $this->uploadDir."/".date("d.H.i.s")."-".$database.".sql";
- $createBackup = exec("/usr/bin/mysqldump --opt --host=$host --user=$user --password=$pass $database > $backupFile");
- }
- return true;
- break;
- case DROPBOX:
- foreach($this->queue as $i => $value)
- {
- $host = $this->queue[$i]["host"];
- $user = $this->queue[$i]["user"];
- $pass = $this->queue[$i]["pass"];
- $database = $this->queue[$i]["database"];
- $backupFile = $this->uploadDir."/".date("d.H.i.s")."-".$database.".sql";
- $createBackup = exec("/usr/bin/mysqldump --opt --host=$host --user=$user --password=$pass $database > $backupFile");
- $this->uploader->upload($backupFile,$this->dropboxDir."/".date("F")."/");
- if($deleteAfterBackup)
- unlink($backupFile);
- }
- return true;
- break;
- }
- }
- else
- return false;
- }
- }
- ?>
Jeg ved godt det ikke plejer at være et problem blandt udviklere, men jeg spørger jeg så inderligt om I ikke vil sætte pris på mit arbejde, og lade min notits i toppen forblive intakt når I bruger koden.
Koden er naturligvis til fri afbenyttelse, men jeg ville da blive slemt ked af det hvis nogle af jer kunne finde på at sælge den uden først at tage kontakt til mig.
Hvis nogle af jer har forslag til forbedringer/ændringer eller anden feedback, skal i være hjertelige velkomne til at smide en kommentar herunder, hvorefter jeg måske vil gennemgå de tilføjede ændringer på min blog (
www.simon-smith.dk).
Vedhæftede filer:
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (3)
jeg kan godt lide at din fil dropboxuploader.php er noget du har kopiret fra nettet, men pis på det, rigtig nice artikel og jeg vil til at bruge den nu.
men pas på du kommer til at døje med mig hvis den ikke virker
kom endelig med flere artikler
Jeg tænkte at der ingen grund var til at lave sin egen Dropbox Uploader klasse, når Dropbox allerede havde været så venlige at stille en til rådighed :-)
Super fedt. Men til lidt mere større projekter, hvor der haves adgang til serveren, havde jeg måske en forestilling om at det vil være smartere at benytte noget SSH-baseret backup såsom rsync. Men kan selvfølgelig godt se det fede i at have mindre projekter på sin dropbox
Du skal være
logget ind for at skrive en kommentar.