MemCached mit PHP5, Windows und Zend Framework

Hier mein Erfahrungsbericht zu MemCached unter Windows XP mit PHP 5 und Zend Framework

Was ist MemCached ?

Mit Memcache lassen sich Teile eines Programmes in den Hauptspeicher verlagern, für die z.B. Datenbankzugriffe oder Dateizugriffe notwendig wären. Grenzen hierfür sind nur der physikalische Speicher im Rechner. Da aber beliebig viele Nodes angebunden werden können, ist dadurch die Größe des Caches beliebig skalierbar machen. Die Größe des Hauptspeichers ist bei den Nodes entscheidend, wobei eine schwache CPU Leistung kein Problem darstellt, da diese nur geringfügig beansprucht wird.
Am einfachsten kann man sich memcached als eine rießige Hash Tabelle vorstellen, die über mehrere Nodes verteilt werden kann.

Wann sollte man memcached einsetzen?

  • große Datenbank mit Millionen von Einträgen
  • hoher Traffic mit mehreren Millionen PageImpressions

memcached bringt wirklich nur bei grossen Projekten etwas, bei kleinen oder mittleren Projekten lohnt sich der Einsatz nicht.
Wer jetzt überlegt, ob sein Projekt “groß” ist, kann es hier mit einigen Webseiten vergleichen, die memcached einsetzen: Livejournal, YouTube, Digg, Facebook, Wikipedia, Gamespot, Slashdot, SourceForge, Bloglines, Kayak.
Um auf das Beispiel Facebook näher einzugehen: Facebook setzt 200 dezidierte memcached Server mit jeweils 16 GB Hauptspeicher ein, was eine ungefähre Größe von 3TB memcache ergibt!

Die gute Verbreitung von memcached liegt wohl auch daran, dass sehr viele Clients unterstützt werden. Hierzu gehören PHP, Perl, Python, Ruby, Java, C, C# und wahrscheinlich noch viele mehr.

memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.

Download und Installation unter Windows XP

Ein guter Einstiegspunkt ist [5]. MemCached kommt eigentlich aus der Linux Ecke ist aber mittlerweile auch für Mac und Win portiert verfügbar.

Getestet habe ich mal Version 1.2.6 unter Windows XP von der Website [6].

Nach dem Download extrahiert man die Datei memcached.exe in das Verzeichnis c:\memcached. memcached.exe startet man nun auf der Commandline / Shell oder richtet es sich als Dienst ein (siehe [7] und [8]):

Dienst einrichten

C:>c:\memcached\memcached.exe -d install

Dienst starten / stoppen

C:>net start “memcached Server”

C:>net stop “memcached Server”

Einsatz mit PHP 5 und Zend Framework

Eine kleine Einführung mit Beispielcode findet sich unter [4]. Das Einrichten von MemCached in der php.ini ist sehr einfach insofern man PECL benutzt oder aber die php_memcache.dll herunterlädt (siehe z.B. [9]) genügt die folgende Zeile in der php.ini gefolgt von einem Server Neustart:

extension=php_memcache.dll

Ein kleiner Beispiel-Code der PHP5 und Zend Framework verwendet:

echo ‘Initialisiere Zend_Cache_Backend…<br>’;
$oBackend = new Zend_Cache_Backend_Memcached(
array(
‘servers’ => array( array(
‘host’ => ‘127.0.0.1’,
‘port’ => ‘11211’
) ),
‘compression’ => true
) );

echo ‘Initialisiere Zend_Logging (Optional aber interessant)…<br>’;
$oCacheLog =  new Zend_Log();
$oCacheLog->addWriter( new Zend_Log_Writer_Stream( ‘e:\aidklinik\logfiles\memcached.log’ ) );

echo ‘Initialisiere Zend_Cache_Frontend…<br>’;
$oFrontend = new Zend_Cache_Core(
array(
‘caching’ => true,
‘cache_id_prefix’ => ‘myApp’,
‘logging’ => true,
‘logger’  => $oCacheLog,
‘write_control’ => true,
‘automatic_serialization’ => true,
‘ignore_user_abort’ => true
) );

echo ‘Initialisiere MemCached-Objekt…<br>’;
$oCache = Zend_Cache::factory( $oFrontend, $oBackend );

echo ‘Stelle Anfrage an Cache…<br>’;
$sCacheId = ‘LargeDataSet’;
$aDataSet=’Fehler’;
if ( ! $oCache->test( $sCacheId ) ) {
echo ‘Nicht im Cache gefunden. Große umständliche Datenbankabfrage nötig!<br>’;
$aDataSet = 42;
$oCache->save( $aDataSet, $sCacheId );
} else {
echo ‘Im Cache gefunden! Performance gesteigert!<br>’;
$aDataSet = $oCache->load( $sCacheId );
}
echo $aDataSet;

Hinweise:

1. Performance-Problem

Bei meinen Testläufen und Zeitmessungen mit XDebug wurde schnell klar: Die systemnahe Verwendung von MemCached ist deutlich(!) performanter als die Verwendung des Zend Frameworks! Zum Einsatz von MemCached ohne Zend Framework siehe [10]. Ich empfehle allen unter PHP5 den direkten Zugriff auf MemCached zu realisieren und nicht das Zend Framework zu verwenden!

2. Stampede-Problem

Terry Chay beschreibt in seinem Blog sehr anschaulich wie er den Stampede-Effekt abfängt sobald ein MemCached-Key abläuft und mehrere User gleichzeitig den Key z.B. über eine Datenbankabfrage neu erstellen wollen:

Stampeding is basically what occurs when you start up the server and have 100,000 concurrent users. If a memcache key is expired (because of a version increment or an expiration), and it is fairly popular a piece of data (say the block list for your web application, or the ad unit for the banner ads), then tons of concurrent processes will see the expired data and will stampede the database with the same request. Databases are slow – which is why we have memcache in the first place – and your site experiences a very nasty hiccup every time this happens.

Absolut lesenswert

Quellen:

  1. http://blog.rakeshxp.com/2007/09/running-memcached-on-windows.html
  2. http://www.splinedancer.com/memcached-win32/
  3. http://jehiah.cz/projects/memcached-win32/
  4. http://ajbrown.org/blog/2008/12/24/memcached-in-php-made-easy-with-zend-framework.html
  5. http://code.google.com/p/memcached/wiki/Start (Version 1.2.6)
  6. http://code.jellycan.com/memcached/ (Version 1.2.6)
  7. http://www.ajohnstone.com/archives/installing-memcached/
  8. http://www.squatlabs.de/webprojekte/performance-optimierung/serverseitige-perfomance-optimierung/memcached-mit-php
  9. http://pureform.wordpress.com/2008/01/10/installing-memcache-on-windows-for-php/
  10. http://de.php.net/memcache
  11. http://terrychay.com/blog/article/keeping-memcache-consistent.shtml

1 thought on “MemCached mit PHP5, Windows und Zend Framework

Leave a Reply

Your email address will not be published. Required fields are marked *