PHP Caching med PEAR Cache
For at få udbytte af denne artikel, regner jeg med at du kender til php og at termer som OOP samt PEAR ikke er nye for dig. Desuden er det en fordel hvis du har brugt PEAR før. Artiklen forklarer om brugen af PEAR's Cache modul til caching af alle former for data.
Da mange mennesker bruger og udvikler Content Management Systemer nu om dage, synes jeg at det ville være fordelagtigt lige at tage hånd om nogle af de problemer der er forbundet med at gemme alt indhold i en database for at hente dette hver gang man skal bruge det.
Hvis man tænker over det er det rent faktisk ret ulogisk at gøre det på den måde, der er ingen grund til at belaste databasen med mange af de samme - og til tider meget tunge - forespørgsler. Her kommer PEAR Cache ind i billedet.
PEAR Cache er et objekt orienteret framework - ligesom det meste af PEAR er - til at gemme arbitrær data i. Dette kan være alt fra tunge funktionskald, til f.eks. database kald eller en sides output.
Det er altid en god idé at starte med at tænke caching ind i sin applikation fra starten af, da det er yderst let at implementere først i processen, men bliver efterhånden mere og mere vanskeligt.
Introduktion:
Før man kan begynde at bruge PEAR Cache skal man have fundet ud af hvor man vil gemme sine cachede data, dette kan f.eks. være en fil eller SQL/LDAP server. Det er desuden ret let at skrive sine egne egne moduler, dette er dog - logisk nok - kun nødvendigt hvis man vil gemme sine data i noget der ikke findes et modul til i forvejen.
Jeg vil tage udgangspunkt i at cachede data skal gemmes på filsystemer.
For overhovedet at kunne bruge PEAR's Cache skal den være tilgængelig i include_path, f.eks. installeret med pear kommandoen, dette gøres ved at kalde:
pear install cache
// hent PEAR Cache ind
require_once "Cache.php";
// opret Cache objekt med en file data motor
$cache =& new Cache('file', array('path' => './cache_data/'));
Dernæst skal man som med alle andre PEAR moduler inkludere Cache i den fil man ønsker at benytte den i og man skal have oprettet sit Cache objekt, så lad os gøre det:
Bemærk: det er en skidt idé at lægge sine cachede data hvor det er muligt for andre at læse dem, derfor læg dem uden for web roden eller nægt adgang til dem i din http server.
Nu har vi så et funktionelt Cache objekt og kan begynde at bruge det. I de næste afsnit vil jeg vise nogle eksempeler på hvordan man kan bruge PEAR Cache.
Eksempel: Simpelt CMS
Hvis vi antager at man skulle lave et simpelt CMS, kunne man let dele dette op i nogle få klasser eller funktioner. Jeg vil i eksempelt bruge følgende 2 funktioner, da disse er nok til at vise min pointe. Nemlig update_page og display_page.
Hver gang man opdaterer sin side kalder man så update_page funktionen, som ud over at opdaterer siden i ens datalager - f.eks. en SQL-database, også sletter den nuværende cachede kopi af sidens data.
Ulempen ved blot at slette sidens cache er så at den første bruger der vil besøge ens side kommer til at vente på at siden bliver genereret ud fra databasen. For at undgå dette kan man generere sidens data med det samme, og blot gemme dens data under dens navn.
Nu kan det være du tænker "Jamen hvad skal jeg med en database?". Svaret et simpelt, gemme dit data i et format hvor du let kan tilgå og manipulere det.
Nu er siden så gemt og en bruger forespørger siden "picard" som ikke er gemt i cachen endnu, da vi brugte den først nævnte mulighed.
Så for at vise vores side kalder vi så display_page som før den henter siden fra data lageret, kigger om siden er cachet. Dette gør man ved at gøre et forsøg på at hente siden og så kigge på retur værdien. Er den lig false, fandtes siden enten ikke, eller var timet ud.
Så simpelt kan det gøres.
Konklusion:
Ved at cache data de korrekte steder kan man lave en meget mere skalerbar applikation, der kan klare store belastninger på lidt hardware. Det man reelt set opnår, er at flytte noget belastning fra datakilden til den maskine der svare på http-forespørgsler. Jeg vil dog mene at det man vinder ved dette sagtens kan opveje det man taber.