[Tutorial] Installer memcache pour PHP

Discussion dans 'Administration d'un site Web' créé par fandecine, 10 Janvier 2008.

  1. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 896
    J'aime reçus:
    0
    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:
     
  2. bproductiv
    bproductiv WRInaute accro
    Inscrit:
    27 Décembre 2004
    Messages:
    3 784
    J'aime reçus:
    0
    une reco, une ! :p
     
  3. athoms
    athoms WRInaute discret
    Inscrit:
    22 Avril 2004
    Messages:
    216
    J'aime reçus:
    0
    Une autre reco :)
    Merci pour ce tutoriel!
     
  4. duplex13
    duplex13 WRInaute discret
    Inscrit:
    30 Juin 2005
    Messages:
    189
    J'aime reçus:
    0
    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
     
  5. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 896
    J'aime reçus:
    0
    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:
     
  6. duplex13
    duplex13 WRInaute discret
    Inscrit:
    30 Juin 2005
    Messages:
    189
    J'aime reçus:
    0
    Merci pour l'explication :D

    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
     
  7. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 896
    J'aime reçus:
    0
    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:
     
  8. duplex13
    duplex13 WRInaute discret
    Inscrit:
    30 Juin 2005
    Messages:
    189
    J'aime reçus:
    0
    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
     
  9. Mumuri
    Mumuri WRInaute passionné
    Inscrit:
    3 Novembre 2004
    Messages:
    1 433
    J'aime reçus:
    0
    bonjour,

    j'aimerai savoir s'il est envisageable de stocker des pages complétes en mémoire ? en gros si çà vaut vraiment le coup.
     
Chargement...
Similar Threads - [Tutorial] Installer memcache Forum Date
pixel facebook, dois-je en installer deux? Facebook 25 Septembre 2018
Installer un compte GWT sur un sous-domaine Redirigé? Crawl et indexation Google, sitemaps 8 Novembre 2017
Luxembourg : Google va t-il installer son data center ou pas ? Google : l'entreprise, les sites web, les services 9 Juillet 2017
Installer wordpress en automatique (avec ovh par ex) ou manuel (ftp) ? Développement d'un site Web ou d'une appli mobile 18 Janvier 2017
Installer un addon dans mon CPanel Développement d'un site Web ou d'une appli mobile 13 Novembre 2016
Re-installer contenu wordpress Demandes d'avis et de conseils sur vos sites 17 Avril 2016
Tutos pour installer elacticsearch sous debian + php/mysql Développement d'un site Web ou d'une appli mobile 17 Août 2015
Installer un CDN vaut-il vraiment le cout? Administration d'un site Web 7 Septembre 2014
Installer Quick Cache ? Débuter en référencement 25 Mai 2014
AWstats - comment l'installer Administration d'un site Web 3 Février 2014
  1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
    Rejeter la notice