Einführung

Diese Anleitung soll helfen  memcached mit libmemcached und igbinary für PHP zu installieren. Es gibt zwar schon eine Reihe von Tutorials im Netz, aber die Mehrzahl deckt lediglich die veraltete memcache Klasse und nicht die neuere memcached. Hilfreich bei der Suche nach passenden Anleitung ist die Namensgleichheit zwischen dem eigentlichen Server memcached und der Klasse memcached. Bei meinen eigenen Recherchen ergab sich auch das Bild, dass viele diesen Unterschied nicht direkt kennen. Für die Verwendung von der memcached Klasse sprechen aber eine Reihe von Gründe, welche Ilia Alshanetsky in einem großartigen Vortrag auf der  ZendCon 2010 nennt:

  • Schneller als memcache.
  • Support für den Serializer igbinary
  • Nutzung der fastlz Library
  • Multi-Server Interface
  • Fail-Over Callback Support

Installation

Für die Installation des memcached und der Aktivierung in PHP mit allen Zusatzfunktionen sind jedoch einige Schritte nötig. Zwar bieten Package Manager naturgemäß eine Erleichterung und können den größten Teil des Prozess sogar automatisieren, leider ist die Wahrscheinlichkeit aber groß, dass man veraltete Versionen erhält. Für cPanel Benutzer -wie in meinem Fall- ergibt sich außerdem das Problem, dass CPanel beim Dependency Resolver von yum eingreift und die komplette Installation verhindert. Abschließend werde ich noch einige Tips zur Einstellung geben.

libevent

Für den memcached Server wird eine aktuelle Version von libevent vorausgesetzt. Vor Installation sollte man darum zu erst eine mögliche veraltete Version entfernen. Verwendet dazu am Besten euren Package Manager. Die Installation der neuen Version geht wie folgt:

Sucht auf der Homepage libevent.org nach dem aktuellen tarbal (tgz Datei) und kopiert euch die entsprechende Url. Ladet diese mit Hilfe von wget runter. Zum Zeitpunkt der Erstellung dieses Artikels sieht das folgendermaßen aus:

wget https://github.com/downloads/libevent/libevent/libevent-2.0.16-stable.tar.gz

Nach dem Download entpacken:

tar zxvf  libevent-2.0.16-stable.tar.gz

Und das ganze konfigurieren, kompilieren und installieren:

cd libevent-2.0.16
./configure
make && make install

Die Pfadinformationen zur neuen libevent Library müssen noch ld dem Library Loader mitgeteilt werden. Dazu die Datei ” /etc/ld.so.conf.d/libevent-i386.conf” mit dem Editor deiner Wahl öffnen und folgende Zeile einfügen:

/usr/local/lib/

Abschließend muss die Config nur noch geladen werden:

ldconfig

memcached (Server)

Die Installation des memcached Servers läuft ähnlich ab. Die aktuelle Version findet sich auf der Homepage, dieses mal geht es jedoch noch einfacher. Dazu direkt diesen Befehl ausführen:

wget http://memcached.org/latest

Er lädt die jeweils aktuelle Version. Anschließend entpacken…

tar -zxvf memcached-1.4.10.tar.gz

…und  konfigurieren, kompilieren und installieren:

cd memcached-1.4.10
./configure
make && make install

Damit das Starten, Stoppen… etwas bequemer ist, setzen wir noch eine kurze Config-Datei auf und richten ein Init-Skript ein. Für die Config  die Datei “/etc/memcached.conf” aufrufen und folgenden Inhalt einfügen:

#Memory a user can use
-m 16
# default port
-p 11211
# user to run daemon nobody/apache/www-data
-u nobody
# only listen locally
-l 127.0.0.1

Besonders der letzte Punkt ist auch für die Sicherheit wichtig. Zugriff von außen sollte nie erlaubt sein. Dann die Datei “/etc/init.d/memcached” öffnen und das folgende Skript einfügen:

#!/bin/bash
#
# memcached This shell script takes care of starting and stopping
# standalone memcached.
#
# chkconfig: - 80 12
# description: 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.
# processname: memcached
# config: /etc/memcached.conf
# Source function library.
. /etc/rc.d/init.d/functions
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/memcached
DAEMONBOOTSTRAP=/usr/local/bin/start-memcached
DAEMONCONF=/etc/memcached.conf
NAME=memcached
DESC=memcached
PIDFILE=/var/run/$NAME.pid
[ -x $DAEMON ] || exit 0
[ -x $DAEMONBOOTSTRAP ] || exit 0
RETVAL=0
start() {
 echo -n $"Starting $DESC: "
 daemon $DAEMONBOOTSTRAP $DAEMONCONF
 RETVAL=$?
 [ $RETVAL -eq 0 ] && touch $PIDFILE
 echo
 return $RETVAL
}
stop() {
 echo -n $"Shutting down $DESC: "
 killproc $NAME
 RETVAL=$?
 echo
 [ $RETVAL -eq 0 ] && rm -f $PIDFILE
 return $RETVAL
}
# See how we were called.
case "$1" in
 start)
 start
 ;;
 stop)
 stop
 ;;
 restart|reload)
 stop
 start
 RETVAL=$?
 ;;
 status)
 status $prog
 RETVAL=$?
 ;;
 *)
 echo $"Usage: $0 {start|stop|restart|status}"
 exit 1
esac
exit $RETVAL

Anschließend muss es noch ausführbar gemacht werden:

chmod +x /etc/init.d/memcached

Das gleiche Spiel mit der Datei “/usr/local/bin/start-memcached”. Öffnen, einfügen…

#!/usr/bin/perl -w
# start-memcached
# 2003/2004 - Jay Bonci <jaybonci@debian.org>
# This script handles the parsing of the /etc/memcached.conf file
# and was originally created for the Debian distribution.
# Anyone may use this little script under the same terms as
# memcached itself.
use strict;
if ($> != 0 and $< != 0) {
 print STDERR "Only root wants to run start-memcached.\n";
 exit;
}
my $etcfile = shift || "/etc/memcached.conf";
my $params = [];
my $etchandle;
# This script assumes that memcached is located at /usr/bin/memcached, and
# that the pidfile is writable at /var/run/memcached.pid
my $memcached = "/usr/local/bin/memcached";
my $pidfile = "/var/run/memcached.pid";
# If we don't get a valid logfile parameter in the /etc/memcached.conf file,
# we'll just throw away all of our in-daemon output. We need to re-tie it so
# that non-bash shells will not hang on logout. Thanks to Michael Renner for
# the tip
my $fd_reopened = "/dev/null";
sub handle_logfile {
 my ($logfile) = @_;
 $fd_reopened = $logfile;
}
sub reopen_logfile {
 my ($logfile) = @_;
 open *STDERR, ">>$logfile";
 open *STDOUT, ">>$logfile";
 open *STDIN, ">>/dev/null";
 $fd_reopened = $logfile;
}
# This is set up in place here to support other non -[a-z] directives
my $conf_directives = {
 "logfile" => \&handle_logfile
};
if (open $etchandle, $etcfile) {
 foreach my $line (<$etchandle>) {
 $line =~ s/\#.*//go;
 $line = join ' ', split ' ', $line;
 next unless $line;
 next if $line =~ /^\-[dh]/o;
 if ($line =~ /^[^\-]/o) {
 my ($directive, $arg) = $line =~ /^(.*?)\s+(.*)/;
 $conf_directives->{$directive}->($arg);
 next;
 }
 push @$params, $line;
 }
}
unshift @$params, "-u root" unless (grep $_ eq '-u', @$params);
$params = join " ", @$params;
if (-e $pidfile) {
 open PIDHANDLE, "$pidfile";
 my $localpid = <PIDHANDLE>;
 close PIDHANDLE;
 chomp $localpid;
 if (-d "/proc/$localpid") {
 print STDERR "memcached is already running.\n";
 exit;
 } else {
 `rm -f $localpid`;
 }
}
my $pid = fork();
if ($pid == 0) {
 reopen_logfile($fd_reopened);
 exec "$memcached $params";
 exit(0);
} elsif (open PIDHANDLE,">$pidfile") {
 print PIDHANDLE $pid;
 close PIDHANDLE;
} else {
 print STDERR "Can't write pidfile to $pidfile.\n";
}

…und ausführbar machen:

chmod +x /usr/local/bin/start-memcached

Jetzt kann man memcached starten:

/etc/init.d/memcached start

libmemcached

Die aktuelle Version muss man wiederum auf der Homepage suchen und dann downloaden:

 wget http://launchpad.net/libmemcached/1.0/1.0.2/+download/libmemcached-1.0.2.tar.gz

Nach dem Download entpacken:

tar zxvf libmemcached-1.0.2.tar.gz

Und das ganze konfigurieren, kompilieren und installieren:

cd  libmemcached-1.0.2
./configure
make && make install

Fertig.

igbinary

Im Normalfall kann man es einfach mit folgenden Befehl installieren:

pecl install igbinary

Nur wenn das nicht geht, muss auf die manuelle Installation zurückgegriffen werden. Die aktuelle Version kann man von php.net  laden:

wget http://pecl.php.net/get/igbinary

Das ganze entpacken:

tar zxvf ...

Bei der Installation muss zuerst ein phpize durchgeführt werden. Gegebenfalls muss man phpize5 verwenden. Dann ist es nötig, dass configure mit “–with-php-config=…/php-config5” aufgerufen werden:

cd ...
phpize
./configure CFLAGS="-O2 -g" --enable-igbinary
make && make install

Als nächstes sollte man die php.ini daraufhin überprüfen, ob igbinary korrekt eingetragen ist. Zwingend nötig ist der Eintrag:

extension=igbinary.so

memcached (PHP)

Wie bei igbinary sollte die Installation via PECL funktionieren:

pecl install memcached

Wenn das nicht möglich, erhält man die aktuelle Version auf php.net:

wget http://pecl.php.net/get/memcached

Entpacken:

tar zxvf ...

Die Installation läuft wie bei igbinary mit phpize ab:

cd ...
phpize
./configure
make && make install

Zum Schluss noch die Kontrolle der php.ini:

extension=memcached.so

Zum Abschluss der kompletten Installation muss nur noch der Webserver neu gestartet werden.

Tips zur Einstellung

Es gibt für igbinary einige zusätzliche Optionen in der php.ini:

session.serialize_handler=igbinary
igbinary.compact_strings=On
apc.serializer=igbinary

Quellen

Folgende Quellen wurden bei der Erstellung dieses Artikel verwendet:

Kommentare sind wie immer willkommen.

Advertisements