login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
Addow
Moeilijkheidsgraad:
Normaal
Hits:
17836
Punten:
Aantal punten:
 (4.33)
Aantal stemmen:
12
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (13)
 

Tutorial:

Server Side Caching

1. Situatieschets
2. Oplossing via Client Side Caching
3. Oplossing via Server Side Caching
4. Slotwoord

1] Situatieschets
Laat ons nog eens werk steken in een bovenal 'nuttig' tutorialke. Server Side Caching, wat is dat nu net voor een beest?? Inderdaad, dat zal wel bij de meesten onder ons in hun grijze brein opborrelen ;-]
Wanneer je "Server Side Caching" ontleedt, kom je toch tamelijk snel tot de conclusie dat het neerkomt op het cachen van gegevens aan de serverzijde (dat was al moeilijk hé?). In het schaduwbeeld daarvan zullen we eerder de Client Side Caching wel beter kennen. We kennen het probleem dat een website geupdate is in de tijd dat je het aan het laden was, en je dus de f5-knop moet nuttigen. (reden: jouw browser bezit een soortement van cache, waar ie al je geladen bestanden/figuren/pagina's in opslaat || oplossing is bvb. je cache zo klein mogelijk instellen.)

Maar we gaan ons hier enkel toeleggen op de term "Server Side Caching" en alles wat daarbij hoort. Dus zullen we beginnen met een probleemstelling:

Sitemasters.be heeft een aantal handige functies in zijn pakket steken. Een paar daarvan zijn de Actieve forumberichten, Nieuwe Scripts, Nieuwste downloads, etc.
Hierbij moeten er dus heel wat query's doorlopen worden, denk je in eerste instantie! En als je website (zoals sitemasters.be) heel wat bezoekers lokt, kunnen de hits wel tamelijk hoog oplopen! Zie je het gevaar: de snelheid zou wel eens flink kunnen dalen (door de paar query's die opgevraagd worden door veel bezoekers!)... en dat is toch het laatste wat we willen zeker?


Deze tutorial zal een tweevoudige oplossing tonen: de trage & de snelle oplossing, door gebruik te maken van respectievelijk "Client Side Caching" & "Server Side Caching". Hier gaan we...

 top
2] Oplossing via Client Side Caching
We gaan van start met de eerste oplossing, die voor de meeste scripters wel lijkt voor de hand te liggen, Client Side Caching. Om deze tut in gans het plaatje te plaatsen, zullen we het illustreren aan de hand van de nieuw scripts sectie.

We starten met het vooropstellen van een fictief tabelleke:
CREATE TABLE scripts (
  id int(11) NOT NULL AUTO_INCREMENT,
  cat_id int(11),
  titel varchar(50),
  uitleg text(),
  code text(),
  poster int(11),
  gepost bigint(25)
);

Veel werk is er dan niet aan om onze top-10 van de nieuwste scripts op te stellen:

<?

setlocale
(LC_TIME, "dutch"); // datumnotatie in nl instellen

// selecteer de laatste 10 nieuwe scripts uit database
$result = mysql_query("SELECT titel FROM scripts ORDER BY gepost DESC LIMIT 0,10");

echo
"<table>"; // begin tabel
while($script = mysql_fetch_assoc($result)) { // start lus
    
$datum = strftime("d-m",$script['gepost']); // enkel DAG-MAAND is voldoende
    
$titel = substr($script['titel'],0,30).".."; // berichttitel afknippen na 30 tekens
    
echo "<tr><td>" . $datum . "</td><td>" . $titel . "</td></tr>";
}
// einde lus
echo "</table>"; // einde tabel

?>

En voilà, zo simpel was het (mits weinig aandacht gespendeerd aan layout, maar 't gaat em om de essentie!)

 top
3] Oplossing via Server Side Caching
Als we nu het "snellere" alternatief eens naderbij gaan bekijken, ben je even 'snel' overtuigd van zijn snelheid ;) Laat ik jullie niet langer in spanning houden en overgaan tot het scripten van de belangrijkste functie.

In het kort: Samengevat ga ik nu een functie uitschrijven (in m'n pagina functies.php) die ervoor zorgt dat je diezelfde top-10 kan cachen op de server, zodat de top-10 enkel geupdate moet worden wanneer er een script is toegevoegd! Dat bespaart ons een hoop querygelaad! And off we go...

<?

function script_top10() {
     
ob_start(); // laat output buffer toe (activeren)
     
setlocale(LC_TIME, "dutch"); // nederlands tijdsformaat instellen

     
echo "<table>"; // starten van de tabel liefst

     
$result = mysql_query("SELECT titel FROM scripts ORDER BY gepost DESC LIMIT 0,10");
     while(
$script = mysql_fetch_assoc($result)) {
           
$datum = strftime("d-m",$script['gepost']); // datum declareren
           
$titel = htmlspecialchars(substr($script['titel'],0,30)).".."; // titel afkorten tot op 30 tekens & filteren
           
echo "<tr><td>" . $datum . "</td><td>" . $titel . "</td></tr>"; // afdrukken op scherm
     
} // einde lus

     
echo "</table>"; // aan ieder begin komt ook een einde, dus ook deze tabel ;)

     
$uitvoer = ob_get_contents(); // steekt gans de buffer in variabele $uitvoer
     
ob_end_clean(); // maakt output buffer leeg en de-activeert het

     // Nu kunnen we kiezen: ofwel steken we gans de uitvoer in een bestand op de server (in folder), ofwel schrijven we het netjes weg naar een configuratie rij in je mysql tabellen.
     // Maar aangezien snelheid primeert in dit geval: steek het maar in een bestandje: cache.inc.php

     
$cache = fopen("cache.inc.php","w");
              
fputs($cache, $uitvoer); // wegschrijven in bestand
              
fclose($cache); // sluit bestandsverbinding
}

?>

Integreren van ons cachebestand:
Zozo, een handige functie die je top-10 van scripts in een bestandje op je server zet. Maar ehm... hoe gaan we nu heel het spellement operationeel maken?? Wat moet er met dit bestand gebeuren? Wel, we moeten nu nog gewoon dit cache-bestandje integreren in onze website:

<?

include("functies.php"); // functies includen

// als het bestand cache.php nog niet bestaat, krijg je vreemde foutmeldingen, dus even aanmaken als het niet bestaat
if (!file_exists("cache.inc.php")) {
     
script_top10();
}

include(
"cache.inc.php"); // includen van ons top-10 cache!

?>

Bij deze is de tweede fase van ons Server Side Caching plan afgewerkt, maar om het geheel nog eens compleet te maken, hangt er nog maar 1 voorwaarde aan vast:

Updaten van ons cachebestand:
Wat gebeurt er met ons cache als iemand een script toevoegd? -> precies! Je moet dus gewoon de script_top10()-functie includen net na het invoegen van het nieuwe script in de database. Zodat ook het cache-bestandje up 2 date blijft, en we nuttig gebruik kunnen maken van gans het systeem!

 top
4] Slotwoord
Ik was plotseling op het systeem gebotst, toen op zoek was gegaan naar "snelle" methodes voor site building. Ik ben toen uitgebreid info gaan verzamelen, en deze kennis wilde ik hier dan ook delen.
Kennis haal ik over het algemeen op php.net & randinfo heb ik uit biblio-boeken & andere tuts gehaald. Dank voor het bestaan van deze, anders zou ik zelf ook een know-nothing van dit onderwerp wezen.

 top


« Vorige tutorial : Bestandssysteem (Maken van een gastenboek) Volgende tutorial : Gd Library Deel 1 »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.015s