PHP-Sessions in memcached speichern

Sessions in PHP sind schon eine feine Sache, allerdings kann es problematisch werden, wenn man vor einer Anwendung einen Load-Balancer hat. Dann muss man entweder seine eigenen Session-Handler mittels session_set_save_handler schreiben, was allerdings einige Zeit verschlingen kann, oder auf bereits vorgefertigte Handler ausweichen.

Memcached hat sich auf der anderen Seite hat sich zum cachen von Daten schon mehrfach beweisen und es bietet sich für das Speichern von Sessions direkt an – und das beste ist, dass es dafür schon direkt einen Session-Handler in der PHP-Extension memcached gibt und die Installation davon bei Debian/Ubuntu schon fast trivial ist.

Einen Nachteil hat das ganze allerdings: Man sollte den memcached-Server nicht “mal eben” neu starten, weil dann alle darin gespeicherten Sessions verloren gehen. Um das zu verhindern, muss man allerdings eine Lösung einsetzten die einen persistenten Speicher verwenden, wie z.B. memcachedb oder membase.

Auf dem Server, der die Sessions mittels memcached speichern soll, muss erstmal memcached installiert werden

apt-get install memcached

Auf dem Client (auf dem die PHP-Scripte liegen) jetzt noch die memcached-extension für php installieren

apt-get install php5-memcached

Jetzt muss in der php.ini nur noch eingestellt werden, dass der “memcached”-Handler für php-Sessions verwendet werden soll und welche Adresse der memcached Server hat. Dazu einfach die /etc/php/apache2/php.ini bearbeiten.

[Session]
session.save_handler = memcached
session.save_path = "10.50.0.2:11211"

Sessions werden jetzt unter der IP-Adresse gespeichert, die bei session.save_path angegeben ist. Anstatt einer einzelen IP kann man auch eine Komma-separierte Liste mit IPs angeben, die als Pool verwendet werden, z.B. “10.50.0.2:11211,10.50.0.3:11211″. Die beiden memcached-Server können auch auf der gleichen IP auf unterschiedlichen Ports liegen, allerdings verliert man dadurch den Vorteil, dass einer der Server wegbrechen kann.

Jetzt nur noch den apache neu laden, dass die Einstellungen auch angewendet werden.

apache2ctl graceful

Fertig – ab jetzt werden die Sessions direkt in memcached gespeichert.