PHP et Memcached

memcached est un service de base de données clé/valeur en mémoire, très pratique pour mettre en cache des résultats et optimiser nos applications. Comment communiquer avec ce service à partir d'une application php ?

Sous Rocky Linux 9.4

Installer le serveur memcached

1dnf install memcached

Configuration via le fichier /etc/sysconfig/memcached

1PORT="11211"
2USER="memcached"
3MAXCONN="64"
4CACHESIZE="256"
5OPTIONS="-U 0 -l 127.0.0.1"

Note: Si ipv6 est désactivé sur le système, il faut retirer la référence éventuelle à ::1

Démarrer le service + au boot

1systemctl enable --now memcached

Vérifier qu'il est bien lancé

 1$ systemctl status memcached
 2● memcached.service - memcached daemon
 3     Loaded: loaded (/usr/lib/systemd/system/memcached.service; disabled; preset: disabled)
 4     Active: active (running) since Wed 2024-07-10 12:13:14 CEST; 2min 33s ago
 5   Main PID: 2972311 (memcached)
 6      Tasks: 10 (limit: 1646482)
 7     Memory: 5.8M
 8        CPU: 34ms
 9     CGroup: /system.slice/memcached.service
10             └─2972311 /usr/bin/memcached -p 11211 -u memcached -m 256 -c 64 -U 0 -l 127.0.0.1

Installer l'extension PHP (via remi-repo)

1dnf install php-pecl-memcached

Vérifier que l'extension est bien active

1$ php -m | grep memcached
2memcached

Exemple d'utilisation, fichier mc.php

 1<?php
 2
 3const KEY = 'test';
 4
 5$mc = new Memcached();
 6$mc->addServer("127.0.0.1", 11211);
 7$res = $mc->get(KEY);
 8if ($res) {
 9    echo "clé " . KEY . " = " . print_r($res, true) . "\n";
10} else {
11    echo "pas de valeur pour la clé " . KEY . ", on la set à 'DEFAULT'\n";
12    $mc->set(KEY, 'DEFAULT');
13}
1$ php mc.php
2pas de valeur pour la clé test, on la set à 'DEFAULT'
3$ php mc.php
4clé test = DEFAULT

On peut indiquer une durée d'expiration, en secondes, avec le 3ème paramètre de la méthode set()

1$mc->set('key', 'value', 60); // la clé key aura une durée de vie d'une minute

Sous MacOS

Installation

1brew install memcached libmemcached zlib

Lancement

1brew services start memcached

Vérification

1$ brew services info memcached
2memcached (homebrew.mxcl.memcached)
3Running: ✔
4Loaded: ✔
5Schedulable: ✘
6User: gus
7PID: 9620

Il n'y a pas de paquet php-memcached avec homebrew, il faut passer par la commande pecl. La commande pecl ne respecte pas la variable d'environnement standard HTTP_PROXY pour setter le proxy, il faut le spécifier avec la commande :

1pear config-set http_proxy $HTTP_PROXY

On installe / compile

1pecl install memcached

On active l'extension en créant le fichier : /usr/local/etc/php/8.3/conf.d/ext-memcached.ini

1[opcache]
2extension=/usr/local/Cellar/php/8.3.9/pecl/20230831/memcached.so

On vérifie que l'extension est bien chargée

1$ php -m | grep memcached
2memcached

Mise à jour

Une mise à jour de php par homebrew peut casser l'extension. Voici la procédure pour réinstaller le module compilé avec la version de php mise à jour :

1pecl uninstall memcached
2unlink /usr/local/Cellar/php/8.3.11/pecl
3pecl install memcached

mettre à jour /usr/local/etc/php/8.3/conf.d/ext-memcached.ini

1[opcache]
2extension=/usr/local/Cellar/php/8.3.11/pecl/20230831/memcached.so

virer dans /usr/local/etc/php/8.3/php.ini

la ligne ajoutée au début du fichier

1extension="memcached.so"

Ressources

comments powered by Disqus