PHP-datacaching met Memcached in ServBay
ServBay is een krachtige lokale webontwikkelomgeving die standaard het hoog-performante Memcached-pakket (Memcached-server) en de bijbehorende PHP-extensie bevat. Dit maakt het voor ontwikkelaars eenvoudig om efficiënte datacaching toe te passen in PHP-applicaties, waardoor de prestaties van hun applicaties aanzienlijk verbeteren.
In dit artikel lees je hoe je Memcached en de bijbehorende PHP-extensie binnen ServBay controleert en gebruikt.
Introductie tot Memcached
Memcached is een snelle, gedistribueerde geheugenobject-cache. Door data tijdelijk in het geheugen op te slaan (zoals databasequeryresultaten, API-responses, paginafragmenten, enzovoort), vermindert Memcached het aantal keren dat de backenddataopslag (zoals een database) geraadpleegd moet worden. Dit versnelt de responstijd en doorvoersnelheid van dynamische webapplicaties aanzienlijk.
Belangrijkste kenmerken
- Hoge prestaties: Data wordt in het geheugen opgeslagen, waardoor lezen en schrijven razendsnel verloopt.
- Gedistrubueerd: Ondersteunt het opzetten van een cluster over meerdere servers, eenvoudig schaalbaar.
- Eenvoudig in gebruik: De protocollen zijn simpel, er zijn veel client-libraries en de integratie is gebruiksvriendelijk.
- Minder belasting op databases: Verlaagt effectief de belasting op databases, vooral in drukbezochte applicaties met veel gelijktijdige aanvragen.
Verschil tussen memcache
en memcached
PHP-extensies
Er zijn twee veelgebruikte PHP-extensies om verbinding te maken met een Memcached-server: memcache
en memcached
. Ondanks de vergelijkbare namen zijn het verschillende extensies met ieder hun eigen API’s en functionaliteiten:
memcache
extensie:- Oudere PHP-extensie.
- Biedt vooral een procedurele API (
memcache_connect()
,memcache_set()
, enz.). - Functionaliteit is basis en mist sommige geavanceerde features, zoals consistente hashing (hoewel sommige clientbibliotheken dit oplossen).
memcached
extensie:- Nieuwere PHP-extensie (aangedreven door de libmemcached-bibliotheek).
- Biedt een objectgerichte API (
Memcached
-klasse). - Ondersteunt meer geavanceerde functies zoals consistente hashing, binair protocol, SASL-authenticatie, flexibelere serialisatieopties, enzovoort.
- De
memcached
extensie wordt over het algemeen aanbevolen vanwege het uitgebreidere featurepakket en actieve onderhoud.
ServBay levert standaard en beveelt het gebruik van de krachtigere memcached
PHP-extensie aan.
Memcached-pakket en PHP-extensie in ServBay
ServBay bevat niet alleen een kant-en-klare Memcached-server die je als beheersbaar pakket kunt gebruiken, maar ook de memcached
PHP-extensie die vooraf is geïnstalleerd en standaard geactiveerd is voor alle geïntegreerde PHP-versies.
Dit betekent dat na installatie van ServBay de Memcached-server en bijbehorende PHP-extensie doorgaans direct klaar zijn voor gebruik, zonder dat je PHP handmatig hoeft te compileren of te configureren.
Status van het Memcached-pakket controleren:
Via het hoofdscherm of het pakketbeheer van ServBay kun je het Memcached
-pakket opzoeken en controleren dat de status op ‘Actief’ staat. Als de server niet draait, start deze dan op.
Controleren of de memcached
PHP-extensie geladen is:
Je kunt eenvoudig controleren of een specifieke PHP-versie de memcached
extensie heeft geladen met de phpinfo()
functie:
Maak een nieuw PHP-bestand in de rootdirectory van je ServBay-website (standaard
/Applications/ServBay/www
), bijvoorbeeldinfo.php
.Voeg de volgende inhoud toe aan het bestand:
php<?php phpinfo(); ?>
1
2
3Bezoek dit bestand via je lokaal geconfigureerde ServBay-website (bijvoorbeeld, als het domein
servbay.demo
is:http://servbay.demo/info.php
).Zoek in de weergegeven
phpinfo
pagina naar "memcached". Zie je een sectie "memcached" met configuratie- en versiedetails, dan is de extensie correct geladen en beschikbaar.
Memcached gebruiken in PHP-code
Heb je gecontroleerd dat de Memcached-server draait en de memcached
PHP-extensie geladen is, dan kun je in je PHP-applicatie de Memcached
-klasse gebruiken om verbinding te maken met de server en cache-operaties uit te voeren.
De Memcached-server draait standaard op localhost
via poort 11211
.
Voorbeeldcode
Hieronder staat een eenvoudig PHP-codevoorbeeld om te laten zien hoe je via de Memcached
-klasse verbinding maakt met de lokale Memcached-server en data wegschrijft en uitleest:
Sla onderstaande code op als een PHP-bestand in de ServBay-websitedirectory (bijvoorbeeld /Applications/ServBay/www/memcached_test.php
):
php
<?php
// Informatie over de Memcached-server
$memcached_host = 'localhost';
$memcached_port = 11211;
// Maak een nieuwe Memcached-client aan
$memcached = new Memcached();
// Voeg de Memcached-server toe aan de clientpool
// de addServer() methode geeft een boolean terug die alleen aangeeft of toevoegen aan de lijst is gelukt, niet of verbinden lukt
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// Let op: addServer faalt meestal alleen bij configuratieproblemen, het betekent niet dat de server onbereikbaar is
die("Het toevoegen van de Memcached-server aan de clientpool is mislukt. Controleer host- en poortinstellingen.");
}
// Test optioneel de verbinding door een niet-bestaande key op te vragen
// get() retourneert false of een lege array als de key ontbreekt of bij verbindingsproblemen
// Memcached::getResultCode() geeft meer detail over de status
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // Probeer een niet-bestaande key te krijgen
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// Als het niet RES_NOTFOUND of RES_SUCCESS is, duidt het mogelijk op verbindingsproblemen
// Let op: RES_SUCCESS kan ook bij een lege waarde voorkomen
// Uitgebreidere connectietests kunnen meer logica of juist specifieke clientverificatie vereisen
// Voor lokale ontwikkeling is een geslaagde addServer en geen fouten bij acties meestal voldoende
echo "Let op: Er lijkt een probleem te zijn bij het verbinden met de Memcached-server. Result Code: " . $result_code . "<br>";
// In productie zou je hier uitgebreidere foutafhandeling doen
} else {
echo "Succesvol verbonden met de Memcached-server ({$memcached_host}:{$memcached_port}).<br>";
}
// --- Voorbeelden van cache-operaties ---
// Data om te cachen
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => '[email protected]',
'status' => 'active'
];
$expiration = 3600; // Cache-verlooptijd in seconden (hier: 1 uur)
// Zet de data in de cache
// set() retourneert een boolean die aangeeft of de actie geslaagd is
if ($memcached->set($key, $data, $expiration)) {
echo "De data is succesvol gecachet in Memcached met key '{$key}', verloop na {$expiration} seconden.<br>";
} else {
echo "Cachen van data is mislukt!<br>";
// Gebruik $memcached->getResultCode() voor de reden van falen
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Probeer data uit de cache te lezen
echo "Data ophalen uit de cache...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get() geeft false terug bij miss of fout
echo "Data succesvol uit de cache opgehaald:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "Geen cache-hit of ophalen is mislukt, key '{$key}'.<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Voorbeeld van verlopen cache (stel tijd is verstreken)
// In een echte applicatie controleer je of $cachedData false is, laad dan data uit de echte bron (zoals database), en plaats opnieuw in cache.
// Voorbeeld: cache wissen
/*
echo "Cache wissen...<br>";
if ($memcached->delete($key)) {
echo "Data succesvol uit de cache verwijderd, key '{$key}'.<br>";
} else {
echo "Verwijderen van cache is mislukt!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Opnieuw proberen de verwijderde data te lezen
echo "Opnieuw proberen om verwijderde data te halen...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "Data alsnog gevonden (verwijderen mislukt):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "Data is niet meer in de cache (zoals verwacht).<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
// Voorbeeld: alle cache legen (voorzichtig gebruiken!)
/*
echo "Alle cache legen...<br>";
if ($memcached->flush()) {
echo "Alle cachdata is gewist.<br>";
} else {
echo "Cachen legen is mislukt!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Bezoek het bestand memcached_test.php
via je lokaal geconfigureerde ServBay-website voor directe feedback over verbinding, cachezetten en -ophalen.
Belangrijke aandachtspunten
- Zorg dat het Memcached-pakket in ServBay daadwerkelijk actief is.
- Memcached luistert standaard op
127.0.0.1
(oflocalhost
) poort11211
. Normaal gesproken hoef je dit niet aan te passen. - Als verbinding vanuit PHP niet werkt, controleer dan de status van het Memcached-pakket en of er geen firewall de lokale verbinding blokkeert.
- De
addServer
-methode van deMemcached
klasse voegt servers alleen toe aan de pool, legt geen permanente verbinding of voert direct connectietests uit. De echte verbinding en checks worden gedaan tijdens methodes alsget
enset
. Bekijk hun return values of gebruikgetResultCode()
voor meer details.
Samenvatting
ServBay maakt het voor ontwikkelaars buitengewoon eenvoudiger om Memcached te gebruiken. Dankzij het geïntegreerde Memcached-pakket en de standaard vooraf geïnstalleerde én geactiveerde memcached
PHP-extensie, kun je zonder ingewikkelde installatie of configuratie direct profiteren van razendsnelle datacaching in je lokale ontwikkelomgeving—de perfecte basis om krachtige, snelle PHP-webapplicaties te bouwen.