20.10.12

PHP Memcache Server einrichten

PHP Memcache Server einrichten

Performance zählt neben Sicherheit, Verlässlichkeit und anderen Dingen zu den wichtigsten Eigenschaften von Software und PHP Applikationen sind davon selbstverständlich nicht ausgenommen. Nun muss man aber immer wieder aufwendige Berechnungen durchführen, auf langwierige Datenbankabfragen warten oder Daten von externen Diensten abfragen. All dies kostet Zeit – nicht unbedingt die idealen Voraussetzungen für eine hohe Performance. Ein eigentlich sehr altes Konzept gegen dieses Problem ist Caching, also das Zwischenspeichern von Daten. Aufgrund der Natur getrennter, nicht persistenter Requests fehlt Webapplikationen die Möglichkeit immer wieder benötigte Daten im RAM abzulegen. Genau um dieses Problem kümmert sich memcached. memcached ist ein Cache-Server der Daten im Arbeitsspeicher ablegen kann. Er stellt dazu eine einfache Key-Value Struktur zur Verfügung, mit der beliebige Daten temporär oder dauerhaft abgelegt werden können.

Schritt 1: memcached installieren und konfigurieren

Um diesen Cache in einer Applikation einsetzen zu können, muss man zunächst den memcache Server installieren und konfigurieren. Im Nachfolgenden die Anleitung für die Installation unter Debian squeeze:

Zunächst muss man memcached per apt installieren:

apt-get update
apt-get install memcached

Anschließend benötigt man noch das dazugehörige PHP-Modul:

apt-get install php5-memcached

Damit wird auch die für den Zugriff nötige libmemcached5 installiert.

Nun kann man den memcache Server konfigurieren:
Die Konfiguration findet sich in der Datei /etc/memcached.conf:

# Die Größe des Arbeitsspeichers in Mb, die der Server verwenden darf.
# Der Speicher wird aber nur belegt wenn benötigt (und nicht generell reserviert).
-m 64

# Mit diesem Kommando kann man den Server an ein Netzwerk Interface binden.
# Da es keine Authentifizierung gibt ist es wichtig, dass der Server nicht
# öffentlich erreichbar ist.
-l 127.0.0.1

# Der Benutzeraccount unter dem der Server laufen soll
-u nobody

# Der Port unter dem der Server erreichbar ist:
-p 11211

# Mit dieser Anweisung kann man die maximale Anzahl an Verbindungen limitieren.
-c 1024

Hat man die Konfiguration nach seinen Wünschen angepasst, muss man den Memcache-Server und Apache neu starten:

/etc/init.d/memcached restart
/etc/init.d/apache2 restart

Damit ist die Installation auch schon abgeschlossen und man kann mit der Implementierung beginnen.

Schritt 2: memcached implementieren

Verbinden:

Zunächst muss man die Memcached Klasse instanzieren und den Server spezifizieren:

$cache = new Memcached();
$cache->addServer('127.0.0.1', 11211);

Übergibt man dem Konstruktor von Memcached eine sog. Persistenz-ID, wird die Verbindung am Ende eines Requests nicht zerstört, sondern bleibt aufrecht. Dabei teilen sich alle Aufrufe mit derselben Persistenz-ID dieselbe Verbindung:

$persistentCache = new Memcached('customID');
$persistentCache->addServer('127.0.0.1', 11211);

Daten speichern:

Nun kann man bereits Werte im Memcache Server speichern:

$cache->set('aKey', $value);

Prinzipiell kann jede Art von Variable gespeichert werden, außer Ressourcen, da diese nicht serialisiert werden kann. Standardmäßig verbleiben die Werte so lange im Cache, bis sie aus Platzmangel gelöscht werden. Man kann jedoch auch eine Ablaufzeit definieren:

$cache->set('aKey', $value, 100);

Dabei muss man 2 Dinge beachten:

  1. Die Angabe erfolgt in Sekunden, gerechnet vom Zeitpunkt der Speicherung.
  2. Angaben die größer als 30 Tage sind (also größer 2592000), werden als Unix-Zeitangabe interpretiert. Das bedeutet das Element verfällt zum übergebenen Zeitpunkt. Z.B.: 2592000 = Das Objekt verbleibt 30 Tage im Cache, 2592001 = Das Objekt verbleibt bis zum 31.01.1970 00:00:01 GMT im Cache.

Die Set-Methode gibt bei Erfolg True, sonst False zurück. War das Speichern nicht erfolgreich, kann man mit dem Methoden getResultCode und getResultMessage Details dazu abrufen:

echo $cache->getResultCode();
echo $cache->getResultMessage();

Neben der set-Methode gibt es auch noch die Methode add. Sie verhält sich wie die Methode set, außer, wenn ein Wert mit demselben Key bereits vorhanden ist. In diesem Fall wird bei add der Wert nicht überschrieben und getresultCode liefert, je nach Memcache Server Version, den Wert Memcached::RES_NOTSTORED oder Memcached::RES_DATA_EXISTS.
Sollte man beim Speichern durch getResultMessage immer die Meldung WRITE FAILURE erhalten, sollte man zunächst sicherstellen, dass man bei addServer 127.0.0.1 anstatt localhost als Adresse nutzt.

Daten lesen:

Das Lesen von gespeicherten Werten gestaltet sich eigentlich sehr einfach:

$cachedValue = $cache->get('aKey');

Die Methode get liefert einfach den zuvor gespeicherten Wert zurück. Ist ein Wert zu diesem Key nicht(mehr) vorhanden gibt die Methode false zurück.

Erhält man nun false, kann man nicht sicher sein, ob der Wert nicht vorhanden ist, oder ob gezielt der Wert false gespeichert wurde. Jedoch kann man dies per getResultCode prüfen:

$cachedValue = $cache->get('aKey');
if($cache->getResultCode() == Memcached::RES_NOTFOUND) {
// Der Wert war nicht im Cache vorhanden.
}

Memcache Server überwachen

Will man seinen Memcache Server überwachen, kann man sich ganz einfach per Telnet zu ihm verbinden:

telnet 127.0.0.1 11211

Hier stehen einem nun folgende Kommandos zur Überwachung zur Verfügung:

stats

Grundlegende Informationen zum Server wie Uptime, momentan geöffnete Verbindungen, Cache Hits, Cache Misses, etc.

stats slabs

Statistiken zur Speichernutzung.

stats items

Informationen zur Nutzung. Z.B. Anzahl an Items, etc.

stats reset

Löscht die Statistik.

Weitere Informationen

Das könnte Sie auch interessieren:


Von: Tags: linux, php, server, tipp, Web

Sag deine Meinung

Die E-Mail Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.






Suche

Bleibe auf dem Laufenden

Mit dem Newsletter verpasst man nie mehr neue Beiträge und wird trotzdem nicht zugespammt.