Backup af MySql databaser til Dropbox med php

Tags:    php mysql dropbox
<< < 123 > >>
Skrevet af Bruger #8773 @ 23.05.2011
Artikel filer

Konstruktøren


Nu skal vi til at skrive vores klasse-konstruktør. Denne bruger vi til at få defineret hvor backup'en skal gemmes på serveren, om filerne skal uploades til Dropbox, og hvis de skal, skal vi også have brugernavn, adgangskode og placering i Dropbox.
Fold kodeboks ind/udPHP kode 

I koden ovenfor begynder vi altså at få smidt nogle værdier ind i de variabler vi definerede før. jeg bruger konsekvent "$this->" til at referere til variabler uden for funktionerne. Dette er ofte ikke nødvendigt, men jeg synes det er en god vane og god kodeskik at gøre det.

I koden tjekker vi først om backup'en skal gemmes i Dropbox. Hvis dette er tilfældet, og brugernavn, kode og mappe i Dropbox er angivet, gemmer vi de pågældende værdier i variablerne.
Hvis backup'en skal gemmes på serveren, gemmes dette i $uploadTo variablen.

Her skal vi også lige være opmærksomme på, at mappen på serveren hvori backup'en skal gemmes er relativ til denne fil! Det vil altså sige, at hvis denne klasse ligger i en eller andet undermappe et sted på serveren, er det relativt til den mappe backup'en vil blive gemt.

Tilføj backup til køen


Nu da vi har fået vores konstruktør på plads, skal vi til at lave en funktion til at tilføje ting og sager til vores backup-kø.
Denne funktion er meget simpel, og gør ikke andet end at modtage detaljer om den backup der skal foretages, og gemmer denne information i et array inde i vores queue array.
Det vil altså sige at vi nu har et to-dimensionelt array til at holde information om de backups der skal tilføjes.
Den yderste dimension er de forskellige backups og den inderste dimension indeholder host, username, password og navnet på databasen.
Koden til dette ser ud som følger:
Fold kodeboks ind/udPHP kode 

Som vi kan se i koden ovenfor, returneres false hvis alle værdier ikke er angivet.
Hvis værdierne er angivet som de skal være, gemmes de blot i det array jeg skrev om før.

Udfør backup køen


Det er her det bliver rigtigt spændende. Det er selve hjertet i klassen, for vi skal nu til at få lavet selve backup'en.

Forløbet igennem funktionen doBackup() kan ses i flow-diagrammet herunder:

Koden af ovenstående kommer samlet set til at se ud som følger:
Fold kodeboks ind/udPHP kode 

Vi skærer lige koden ud i mindre bider så det er lidt lettere at følge med i hvad der sker for alles vedkomene :)

Først har vi vores if()-sætning. Den er der ikke så meget at tage fejl af. Den tjekker blot om størrelsen på vores array er større end 0, altså om det er tomt, hvorefter vi kan fortsætte til et switch-statement.
Her tjekker vi om vores $uploadTo variabel er sat til SERVER eller DROPBOX (1 eller 2).
Hvis den er sat til server, begynder vi på vores backup.
Først henter vi lige værdierne ud af vores array og gemmer den i et par metoder så vi har styr på dem:
Fold kodeboks ind/udPHP kode 


Det næste vi gør er at lave en variabel, $backupFile, hvori vi angiver hvor filen skal gemmes - ud fra vores $uploadDir variabel - og samtidig giver filen et navn.

Navnet har jeg valgt at bygge op som:

dd.tt.mm.ss-DATABASE.sql

Hvor:
dd = dag på måneden
tt = timer
mm = minutter
ss = sekunder
DATABASE = navnet på den database vi er ved at tage backup af

Koden kommer altså til at se ud som følger for navngivningen:
Fold kodeboks ind/udPHP kode 


Den sidste, og nok ogås den vigtigeste linje, er den der eksekverer selve backup'en. Her bruger vi serverens mysqldump til at foretage backup'en.

Placeringen af denne kan variere fra server til server. Hos Surftown er den placeret i usr/bin/mysqldump

mysqldump tager en masse forskellige argumenter når man kalder den. Du kan læse mere om disse hos MySql.

De eneste argumenter vi skal bruge er:

--opt
--host
--user
--password

De siger mere eller mindre sig selv. Hvis du er interesseret i de specifikke detaljer om argumenterne, kan du som sagt læse mere om disse hos MySql.

Vi eksekverer altså mysqldump på serveren, sender de argumenter med vi skal have med og sørger for at fortælle hvor vi gerne vil have gemt vores backup på serveren. Alt dette kommer til at se ud som følger:
Fold kodeboks ind/udPHP kode 


Det var sådan set det. Hvis ikke noget er slået fejl, returnerer vi nu true til brugeren, og alt er godt.

Hvis der i stedet skal tages backup til Dropbox, er forløbet næsten det samme.
Igen starter vi med at at lave nogle lokale variabler til at holde vores information til at logge ind i databasen.
Navnet til filen starter vi også med at sætte til det samme, hvorefter vi eksekverer vores backup igen.

Den første del af koden er altså præcis ligesom den anden backup. Forskellen kommer i det næsten trin, hvor vi skal have uploaded vores backup til Dropbox.
Her kalder vi funktionen upload fra vores uploader objekt. Denne funktion tager filens placering på serveren som det ene argument og placeringen i Dropbox som det andet argument.
I den valgte mappe i Dropbox oprettes en mappe med månedens navn hvori filen uploades.

Den samlede kode til uplaod i Dropbox ender altså med at se ud som følger:
Fold kodeboks ind/udPHP kode 


Til sidst tjekker vi om filen skal slettes fra serveren igen eller om den skal beholdes. Man kan vælge at beholde filerne på serveren som en ekstra sikkerhed hvis man ønsker dette.

Da Dropbox fungerer ved at have filerne liggende på deres server og samtlige computere jeg synkroniserer med, mener jeg det er sikkerhed nok.
Jeg synkroniserer også min egen computer med en ekstern harddisk en gang om ugen, så jeg at jeg er dækket godt ind hvis der skulle ske noget.

Til slut i funktionen returneres false hvis det viste sig at vores kø var tom, altså det tjek vi lavede aller først.


Vedhæftede filer:


<< < 123 > >>

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)

User
Bruger #16454 @ 31.05.11 00:35
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.:D

men pas på du kommer til at døje med mig hvis den ikke virker ;)

kom endelig med flere artikler:P
User
Bruger #8773 @ 31.05.11 08:58
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 :-)
User
Bruger #5097 @ 23.08.11 00:39
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.
t