Mit Memcache lassen sich Teile eines Programmes in den Hauptspeicher verlagern, für die z.B. Datenbankzugriffe oder Dateizugriffe notwendig wären. Memcache nimmt der Datenbank fantastisch
viel Arbeit ab. Alle Objekte sind im Memcache, kein Code greift direkt auf die Datenbank zu.
Die Datenbank wird dadurch um eine Größenordung entlastet. Was die Datenbank leisten müsste
sieht man dann, wenn der Cache leer ist.
Der Memcache ist ein verteilter Speicher. Er ist verteilt über mehrere Rechner. Will man keine Rechner extra für den Memcache abstellen, dann verwendet man traditionell die Webserver auch als Memcache-Server. Das heißt nicht, dass es schneller wird, weil die meisten Zugriffe nicht lokal sind, aber billiger weil man keine extra Rechner braucht. Die Webserver hat man ja sowieso. Die Standardvorgehensweise ist also: 10 Webserver hinter einem Loadbalancer. Auf jedem Webserver ein memcached. Das wird deshalb empfohlen, weil Webserver vor allem CPU brauchen (CPU bound) und der Memcache vor allem Speicher (memory bound). Man kann also die jeweils “andere” Ressource auch noch nutzen.
Installation und Konfiguration von memcache
memcached herunterladen
cd /tmp && wget http://www.danga.com/memcached/dist/memcached-1.2.3.tar.gz
Kompilieren und Installieren
cd memcached-1.2.3
./configure --prefix=/usr --sysconfdir=/etc
make && make install
Starten des Dienstes
/usr/bin/memcached -d -m 2048 -l 10.0.0.40 -p 11211
Erklärung zu den verwendeten Parametern:
- -d Startet memcached als Dienst
- -m Gibt an, wieviel Hauptspeicher memcached benutzen kann. Diese Angabe wird in MB angegeben
- -l Unter welcher IP der Daemon angesprochen wird
- -p Unter welchem Port der Daemon angesprochen wird
r23@home:~> /usr/bin/memcached -h
memcached 1.2.3
-p <num> TCP port number to listen on (default: 11211)
-U <num> UDP port number to listen on (default: 0, off)
-s <file> unix socket path to listen on (disables network support)
-l <ip_addr> interface to listen on, default is INDRR_ANY
-d run as a daemon
-r maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num> max memory to use for items in megabytes, default is 64 MB
-M return error on memory exhausted (rather than removing items)
-c <num> max simultaneous connections, default is 1024
-k lock down all paged memory
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
-h print this help and exit
-i print memcached and libevent license
-b run a managed instanced (mnemonic: buckets)
-P <file> save PID in <file>, only used with -d option
-f <factor> chunk size growth factor, default 1.25
-n <bytes> minimum space allocated for key+value+flags, default 48
Memcached mit PHP nutzen
Um memcached mit PHP nutzen zu können, muss das PECL Modul memcache verwendet werden.
Da PECL-Erweiterungen nicht mit PHP mitgeliefert werden, müssen sie nachträglich installiert werden. Danach kann man sie, wie andere Erweiterungen auch, von PHP aus verwenden.
Der Installer kümmert sich darum, dass die Erweiterung automatisch in der neusten Version heruntergeladen, das Archiv entpackt, die Erweiterung kompiliert und in das Erweiterungs-Verzeichnis (./ext) kopiert wird. Im Anschluss muss die Erweiterung noch in der php.ini eingetragen werden.
Um die Änderungen zu aktivieren, muss der Webserver neu gestartet werden. Danach kann über phpinfo (Admin => Hilfsprogramme => Server Info hier PHP Version) validiert werden, ob memcache unter PHP verfügbar ist.
Passen Sie nun noch die Port und IP Adresse von Ihren Memcach Server in
~/shop/includes/functions/function_db.php an
$dbconn->memCache = true; // should we use memCache instead of caching in files
$dbconn->memCacheHost = '126.0.1.1'; // $db->memCacheHost = array($ip1, $ip2, $ip3); // $db->memCacheHost = $ip1; still works
$dbconn->memCachePort = '11211'; // this is default memCache port
$dbconn->memCacheCompress = false; // Use 'true' to store the item compressed (uses zlib)