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
1extension=/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
1extension=/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"