Contexte
Lors de la création d'un site web en PHP, vous pouvez stocker certaines données dans la variable globale $_SESSION pour y accéder facilement. Le fichier de configuration ini de PHP contient des configurations [Session] permettant de stocker ces données dans un fichier ou sur un serveur Memcached. L'option session.save_handler = memcached détermine le mécanisme de stockage. Dans la plupart des cas, les données de session ne nécessitent pas de persistance. La mise en cache des informations de session dans Memcached améliore les performances du site web.
Description du problème
ApsaraDB for Memcache et les instances Memcached auto-hébergées respectent toutes deux le protocole standard Memcached. Certains utilisateurs souhaitent migrer les informations de session stockées dans leur instance Memcached auto-hébergée vers ApsaraDB for Memcache sans modifier le code, afin de réduire l'utilisation de la mémoire du serveur et les coûts liés à la maintenance. Cette rubrique vous guide dans la résolution des problèmes susceptibles de survenir lors de la migration.
La principale différence entre ApsaraDB for Memcache et une instance Memcached auto-hébergée réside dans l'authentification par identifiant et mot de passe.
ApsaraDB for Memcache : ApsaraDB for Memcache est un cluster distribué qui offre des services externes de manière uniforme. Il assure l'équilibrage de charge sans point de défaillance unique (SPOF) et permet d'ajuster la configuration de manière flexible sans redémarrer le service. Des mécanismes de sécurité appropriés sont en place pour les services externes, tels que les listes d'autorisation, la limitation du débit et l'authentification par identifiant et mot de passe.
Memcached auto-hébergé : La plupart des instances Memcached auto-hébergées ne nécessitent ni identifiant ni mot de passe ; l'authentification SASL est donc absente par rapport à ApsaraDB for Memcache. Pour migrer les informations de session stockées dans un Memcached auto-hébergé vers ApsaraDB for Memcache, vous devez configurer l'identifiant et le mot de passe dans le fichier php.ini.
Solution
-
Cette fonctionnalité n'est pas prise en charge par les anciennes versions de l'extension PHP Memcached. Mettez à niveau l'extension PHP Memcached vers la version 2.2.0. Voici un exemple de code :
wget http://pecl.php.net/get/memcached-2.2.0.tgz tar zxvf memcached-2.2.0.tgz cd memcached-2.2.0 phpize ./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl make make install Localisez le fichier
memcached.somis à jour et exécutez la commandestatpour confirmer la mise à niveau (vérifiez la date de dernière modification).-
Modifiez la configuration du fichier php.ini.
-
Section Session : localisez la section
[Session]et modifiez le moteur de stockage comme suit :session.save_handler = memcached **(Attention: it has a d)**Modifiez l'adresse de stockage, c'est-à-dire l'adresse d'accès Memcache, comme suit :
session.save_path = "be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com:11211" (Attention: for an extension with a d, no preceding tcp:// is needed. For an extension without a d, the preceding tcp:// is required)Définissez la durée de vie maximale des clés mises en cache dans Memcached :
session.gc_maxlifetime = 1440 (Unit: second. A reasonable life time is strongly recommended to make sure that only hotspot data is cached in ApsaraDB for Memcache) -
Section Memcached : dans la section globale du fichier php.ini, créez une section distincte
[memcached]et ajoutez la configuration suivante :[memcached] memcached.use_sasl = On memcached.sess_binary = On memcached.sess_sasl_username = "your_ocs_name" memcached.sess_sasl_password = "your_ocs_password" memcached.sess_locking = Off
-
L'installation est terminée. Pour consulter d'autres paramètres utiles dans les sections Memcached et Session mentionnées ci-dessus, reportez-vous aux liens suivants.
http://php.net/manual/en/memcached.configuration.php
http://php.net/manual/en/session.configuration.php
Test
Créez le code de test suivant dans le fichier session.php :
<?php
session_start();
$sn = session_id();
echo "session id:".$sn."\n";
$_SESSION["ocs_key"]="session_value";
echo "session:".$_SESSION["ocs_key"]."\n";
?>
Le résultat obtenu est le suivant :
session id:ttrct9coa2q62r2sodlq4qf376
session:session_value
Récupérez les données écrites par session.php depuis Memcache à l'aide du code de test situé dans le fichier get.php.
<?php
$memc = new Memcached();
$memc->setOption(Memcached::OPT_COMPRESSION, false);
$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memc->addServer("be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com", 11211);
$memc->setSaslAuthData("your_ocs_name", "your_ocs_password");
echo $memc->get("memc.sess.key.ttrct9coa2q62r2sodlq4qf376");
/*Attention: Here the key has a prefix defined by the memcached.sess_prefix field in php.ini. The default value is "memc.sess.key." The prefix is followed by the sessionid "ttrct9coa2q62r2sodlq4qf376" as shown above. */
?>
Résultat :
ocs_key|s:13:"session_value";
Cela confirme que la SESSION PHP a été écrite avec succès dans Memcache.