[Tutorial] Installer memcache pour PHP

WRInaute passionné
Suite à une discussion et quelques MP me demandant comment installer et paramétrer memcache, je vous livre un petit tuto :wink:

Je précise que le script perl de chargement de la configuration du daemon memcached n'est pas de moi mais de Jay Bonci et que j'ai ré-ecrit le script shell de lancement du daemon deDanny Bembibre ( http://www.vbseo.com/blogs/danny-bembib ... cached-44/ ) prévu pour CentOS pour l'adapter à la Debian etch (le reste est de moi :D ). Merci donc de laisser les commentaires dans les scripts par respet pour leurs auteurs.

C'est parti !

Pour installer memcached et memcache pour PHP à partir des sources, il vous faut bien entendu disposer sur votre serveur des outils de compilation et de configuration (gcc, g++, make, autoconf, automake, libtool, flex, bison etc ...). Pour savoir si ces outils sont installés, il suffit de saisir en ligne de commande :

Code:
 sd-10781:~# whereis g++
g++: /usr/bin/g++

Si le programme est absent, un simple apt-get fera l'affaire !

Il faut également installer le paquetage zlib1g-dev

On choisi d'installer les sources dans /usr/local/src

1 - Installation de memcached

on récupère l'archive memcached, on la décompacte, on la compile et on l'installe :

Code:
cd /usr/local/src
wget http://www.danga.com/memcached/dist/memcached-1.2.4.tar.gz
tar zxf memcached-1.2.4.tar.gz
cd /usr/local/src/memcached-1.2.4
./configure
make
make install

On va maintenant créer un fichier de configuation indiquant à memcached : /etc/memcached.conf

1 - la taille mémoire à utiliser (parametre -m)
2 - le port sur lequel memcached sera accessible (parametre -p)
3 - l'utilisateur qui executera memcached (parametre -u)
4 - preciser que memcached doit juste être utilisé en local (parametre -l 127.0.0.1) consultez la doc si vous utilisez un cluster de serveurs :wink:

Code:
#Quantité mémoire à allouer à memcached
-m 16
# port
-p 11211
# utilisateur pour executer le daemon nobody/apache/www-data
-u nobody
# ecouter localement seulement
-l 127.0.0.1

On crée maintenant le script shell de lancement du daemon : /etc/init.d/memcached
Code:
#!/bin/bash
#
# memcached    Ce script shell prend en charge le démarrage et l'arrêt du daemon memcached.
#
# description: memcached est un système de cache mémoire distribué,
#              performant et generique, créé dans le but d'accelérer
#              les sites web dynamique en diminuant la charge sur la BDD.
#              
# fichier de configuration du daemon : /etc/memcached.conf
# script de chargement du lancement du daemon avec sa config : /usr/local/bin/start-memcached
#
# sur une idée de Danny Bembibre ( http://www.vbseo.com/blogs/danny-bembibre/daemon-scripts-memcached-44/ )
#
# adapté pour Debian etch par Jérôme Rossignol ( http://www.blog-mestre.fr )
#

. /lib/lsb/init-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
DESC="memcached"
PIDFILE=/var/run/memcached.pid

test -x $DAEMON || exit 0
test -x $DAEMONBOOTSTRAP || exit 0

set -e

start() {
        log_daemon_msg "Starting $DESC" 
        log_end_msg 0
        start-stop-daemon --start --quiet	--pidfile $PIDFILE --exec $DAEMONBOOTSTRAP -- $DAEMON_OPTS ; 
}

stop() {
    if [ -f $PIDFILE ]; then
        if start-stop-daemon --quiet --stop --oknodo --retry 30	--pidfile $PIDFILE --exec $DAEMON; then
            rm -f $PIDFILE
	        log_daemon_msg "Stopping $DESC" 
            log_end_msg 0
        else
            log_end_msg 1
        fi
    else
        log_daemon_msg "$DESC not running"
        log_end_msg 0
    fi
}

case "$1" in
 start)
  start
  ;;
 stop)
  stop
  ;;
 restart|reload)
  stop
  start
  ;;
 *)
  echo $"Usage: $0 {start|stop|restart|reload}"
  exit 1
esac

On oublie pas de lui donner les droits d'éxécution : chmod +x /etc/init.d/memcached

On crée le fichier perl /usr/local/bin/start-memcached


Code:
#!/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";
}

et on lui donne aussi les droits d'exécution : chmod +x /usr/local/bin/start-memcached

On indique maintenant à notre serveur de lancer le daemon au démarrage :

Code:
update-rc.d /etc/init.d/memcached defaults

Memcached est installé. on utilise les commandes suivantes pour le lancer ou l'arrêter :

Code:
/etc/init.d/memcached start
/etc/init.d/memcached stop
/etc/init.d/memcached restart


Hé! vous barrez pas, c'est pas fini ! Il faut maintenant recompiler PHP pour qu'il utilise memcache :wink:

Bon, on respire un grand coup et on s'y remet :D


On récupère l'archive de la librairie memcache pour PHP, on la décompresse et on la copie dans le dossier ext de nos sources PHP (dans l'exemple c'est php 5.2.4 dont les sources se trouvent dans /usr/local/src/php-5.2.4 )

Code:
cd /usr/local/src
wget http://pecl.php.net/get/memcache-2.2.1.tgz
tar zxf memcache-2.2.1.tgz
mv /usr/local/src/memcache-2.2.1 /usr/local/src/php-5.2.4/ext/memcache

Maintenant il nous faut reconstruire le fichier configure de php pour qu'il prenne en compte notre nouvelle extension :

Code:
cd /usr/local/src/php-5.2.4
rm configure
./buildconf --force

Vous pouvez maintenant recompiler PHP en oubliant pas de préciser --enable-memcache dans vos options de configuration :

Code:
./configure ..... --enable-memcache .....
make
make install

Si php est compilé statiquement avec apache, vous devez aussi recompiler apache :D

Vous redémarrez apache ainsi que le daemon memcached et c'est prêt.

Pour utiliser memcache avec php, repportez à la doc de php (http://fr3.php.net/manual/fr/ref.memcache.php) et ayez un peu d'imagination pour utiliser cette mémoire partagée. (Par exemple, je l'utilise beaucoup pour stocker des classe sérialisées) mais je fais confiance à votre imagination ...

Ouf! c'est fini ! mais pas de panique, c'est plus long à lire qu'à faire :wink:
 
WRInaute discret
Bonjour,

Félicitations pour le tutoriel. Je le mets dans mes favoris.

Par contre, j'utilise en ce moment php_accelerator et je voudrai savoir si memcache est compatible avec php_accelerator et si ce sont des modules complémentaires ?

De plus est-ce que ça demande beaucoup de mémoire sur le serveur ?

Merci
 
WRInaute passionné
Memcache n'est pas comparable à php-accelerator.

php-accelerator et un cache d'opcode pour php alors que memcache est un serveur de memoire partagée utilisable avec php mais aussi d'autres langages de script.

La mémoire allouée à memcache est paramétrable dans sa config :wink:
 
WRInaute discret
Merci pour l'explication :D

fandecine a dit:
La mémoire allouée à memcache est paramétrable dans sa config :wink:

Par contre avec un serveur dédié qui a 512 ko de mémoire vive dont en général à peine 60 ko libre, est-ce que c'est conseillé d'installer memcache ? Et si oui avec quelle taille du cache ?

Merci

Vincent
 
WRInaute passionné
duplex13 a dit:
Merci pour l'explication :D

fandecine a dit:
La mémoire allouée à memcache est paramétrable dans sa config :wink:

Par contre avec un serveur dédié qui a 512 ko de mémoire vive dont en général à peine 60 ko libre, est-ce que c'est conseillé d'installer memcache ? Et si oui avec quelle taille du cache ?

Merci

Vincent

c'est à toi de voir comment l'utilisation de memcache serait de nature à diminuer la taille de tes processus donc de libérer de la mémoire.

Une bonne utilisation de memcache est de l'utiliser pour cacher des données necessitant un traitement gourmand en ressources et en mémoire et présente sur de nombreuses pages du site.

Exemple avec un site de bandes déssinées: Sur chaque page du site tu présente la liste des 15 dernières bandes dessinées que tu as ajouté (titre avec lien, date, auteur etc ...). Cela nécessite de faire une requete mysql pour chaque page. Tu peux stocker le résultat dans un tableau par exemple, le sérialiser et le stocker en mémoire partagée. Losque tu dois l'utiliser, tu testes si il est en mémoire, si il n'y est pas tu le génére à partir de la bdd, si il y est, tu l'utilise directement. :wink:
 
WRInaute discret
Merci encore pour toutes ces explications. Dès que j'ai le temps et le courage, je vais tester memcache sur mon serveur.

A plus

Vincent
 
WRInaute passionné
bonjour,

j'aimerai savoir s'il est envisageable de stocker des pages complétes en mémoire ? en gros si çà vaut vraiment le coup.
 
Discussions similaires
Haut