60 votes

Est-il recommandé de stocker les sessions PHP dans MemCache?

Je travaille avec quelques serveurs web derrière un répartiteur de charge et je peux activer des sessions persistantes pour maintenir un utilisateur sur un serveur web spécifique - cela fonctionnera.

J'ai lu à propos des sessions PHP & de MemCache. Je dois dire que ce que j'ai lu est un peu confus car certaines pages disent que c'est une bonne idée et d'autres le contraire.

Questions :

  1. Est-il possible de conserver les sessions PHP dans MemCache ?
  2. Est-il préférable d'utiliser des sessions persistantes plutôt que MemCache ?
  3. Quels sont les problèmes avec les sessions PHP dans MemCache - note : je peux obtenir suffisamment de cache (Amazon donc il est extensible).

0 votes

Une troisième option consiste à stocker les sessions dans la base de données. Vous pouvez utiliser la méthode session_set_save_handler() : php.net/manual/en/function.session-set-save-handler.php. Vous bénéficierez d'un avantage en termes de performances qui sont plus faciles à mettre à l'échelle.

2 votes

Ne jamais utiliser une base de données comme gestionnaire de sessions. C'est un très mauvais conseil de la part de @Jabari. En réalité, vous devriez minimiser l'utilisation des bases de données au strict nécessaire pour économiser la charge et la mémoire. C'est pourquoi nous avons des outils comme memcached et apc. J'utilise memcached pour les lectures/écritures fréquentes comme les sessions et apc pour stocker des données qui sont assez constantes comme des articles et des options pour les boîtes de sélection dans les formulaires. La base de données est alors utilisée comme une solution de secours et pour réinitialiser memcache et apc si nécessaire...

0 votes

@Jette Gardez à l'esprit que ce commentaire date de 2012. Oui, memcache et/ou Redis sont de bien meilleures options.

69voto

1: OUI. Et je recommande vivement de stocker les sessions PHP dans Memcached. Voici pourquoi :

Memcached est idéal pour stocker de petits morceaux de données fréquemment consultés par la base de données et le système de fichiers.

Memcached a été spécifiquement conçu pour les sessions. C'était à l'origine l'idée du développeur principal de livejournal.com et a ensuite été utilisé pour mettre en cache le contenu des publications des utilisateurs. Le bénéfice était immédiat : la plupart des actions se déroulaient en mémoire. Les temps de chargement des pages ont considérablement été améliorés.

Heureusement, PHP et Apache ont une mise en œuvre facile pour gérer les sessions avec Memcached. Il suffit d'installer avec quelques commandes shell

exemple pour Debian :

sudo apt-get -t stable install php7.4-memcached

et

modifier vos paramètres php.ini pour quelque chose de similaire à :

(retrouvé sur https://www.php.net/manual/en/memcached.sessions.php)

 session.save_handler = memcached
 ; changer le serveur:port selon vos besoins...
 session.save_path = "localhost:11211"

La clé est le session.save_path

Elle ne pointera plus vers un chemin de fichier relatif sur votre serveur. APC a été mentionné - APC pour le mise en cache des fichiers .php utilisés par le programme. APC et Memcached réduiront considérablement les E/S et libéreront Apache/Nginx pour servir les ressources, telles que les images, plus rapidement.

2: Non

3: L'inconvénient fondamental d'utiliser Memcached est la volatilité des données

Les données de session ne sont pas persistantes dans Memcached. Donc si et quand le serveur plante, toutes les données en mémoire sont perdues. Tout le monde devra se reconnecter.

Et puis vous avez la consommation de mémoire...

Rappelez-vous : les sessions sont stockées en mémoire. Si votre site gère un grand nombre d'utilisateurs simultanés, vous devrez peut-être débourser un peu plus d'argent pour une allocation de mémoire plus importante.

1 votes

Nous utilisons cela de manière intensive et Memcached est définitivement la meilleure option. Je ne vous recommanderais même pas d'utiliser le stockage sur système de fichiers pour les raisons évidentes mentionnées dans la réponse.

5 votes

Il s'est écoulé quelques années depuis que j'ai posté cette réponse, et il est bon de noter qu'il existe une alternative robuste pour le dimensionnement des sessions: Redis. PHP dispose d'une excellent solution clé en main connue sous le nom de bibliothèque Predis et sa mise en œuvre ne prend que quelques minutes, presque aussi facile que la solution ci-dessus avec Memcached.

2 votes

Je suis d'accord avec Dreadful code, selon l'utilisabilité ici Redis pourrait être une meilleure solution. Mais cela dépend de la pile logicielle utilisée à mon avis. Pour nous, nous avons tendance à utiliser à la fois Memcache et Redis en raison des variables de session intégrées de PHP dans notre application. Redis fonctionne comme une recherche de clé de produit. C'est fait par conception, support hérité et organisation. Redis pourrait facilement être utilisé à la place pour tout.

9voto

Brenton Alker Points 4739

1. Oui, il est possible de conserver les sessions PHP dans memcached.

L'extension memcache est même livrée avec un gestionnaire de session qui nécessite très peu de configuration pour être opérationnel. http://php.net/manual/en/memcached.sessions.php

2. Memcache/Sticky Sessions

Je ne sais pas vraiment lequel est "meilleur". Je pense que cela va être l'une de ces réponses "ça dépend". Cela dépend probablement de vos raisons d'équilibrage de charge. Si un petit nombre d'utilisateurs génère une grande charge chacun, ou s'il s'agit d'un grand nombre générant une petite charge chacun.

3. Inconvénients de Memcache

Il existe probablement 2 inconvénients principaux à l'utilisation de memcache pour le stockage des sessions.

Premièrement, il est volatile. Cela signifie que, si l'une de vos instances de memcached est redémarrée/plante, etc., toutes les sessions stockées dans cette instance sont perdues. Alors que si elles utilisaient des sessions basées sur des fichiers traditionnels, elles seraient toujours là lorsque le serveur reviendrait.

Deuxièmement, et probablement plus pertinent, memcached ne garantit pas la persistance, il est uniquement destiné à être un cache. Les données peuvent être supprimées de memcached à tout moment, pour n'importe quelle raison. En réalité, les données ne devraient être supprimées que si le cache se rapproche de ses limites de taille. Les données les moins récemment consultées seront expulsées. Encore une fois, cela pourrait ne pas être un problème, car l'utilisateur est probablement parti si sa session est obsolète, mais cela dépend de vos besoins.

0 votes

Etes-vous sûr de 3? Je ne pense pas que vous perdiez votre session de memcache si vous redémarrez memcache

2 votes

Oui, je suis sûr. Du moins dans ses configurations normales. Memcached stocke des données en mémoire (RAM) seulement. Si vous redémarrez l'ordinateur, ou même juste le service, elles seront perdues. Il est conçu comme un cache, pas comme un stockage persistant. Si vous avez besoin de persistance, d'autres options comme memcacheDB, redis ou de nombreuses autres bases de données plus traditionnelles (par exemple MySQL) peuvent également être utilisées pour les sessions (Consultez les réponses ici stackoverflow.com/questions/1316852/… - c'est une question Java, mais de nombreuses (la plupart/toutes?) réponses sont encore pertinentes)

0 votes

Avec une configuration raisonnable, vos sessions peuvent durer même après un redémarrage de Memcache. Vous devez effectuer une écriture périodique où vous mettez à jour la session dans la base de données également à chaque X chargement de page ou similaire. Ensuite, la session reste à jour. Si votre session est très chargée en données, cela peut ne pas fonctionner.

5voto

ribluc Points 51

Si vous souhaitez utiliser l'extension "memcacheD" et non "memcache" (car ce sont deux extensions différentes) pour le contrôle des sessions, vous devez faire attention à modifier le fichier php.ini.

La plupart des ressources web de Google sont basées sur memcache car c'est une version antérieure à memcacheD. Elles diront ce qui suit:

session.save_handler = memcache 
session.save_path = "tcp://localhost:11211" 

Mais cela n'est pas valide pour memcacheD.

Vous devez modifier le fichier php.ini comme suit:

session.save_handler = memcached 
session.save_path = "localhost:11211" 

Il n'y a aucun identifiant de protocole.

De: http://php.net/manual/en/memcached.sessions.php#99646

2voto

indika Points 184

À mon avis, il n'est pas recommandé de stocker les sessions dans Memcached. Si une session disparaît, l'utilisateur est souvent déconnecté. Si une partie du cache disparaît, ou en cas de panne matérielle, cela ne devrait pas causer de douleur notable à vos utilisateurs. Selon le site de memcached, "memcached est un système de mise en cache d'objets en mémoire distribuée et haute performance, générique par nature, mais destiné à être utilisé pour accélérer les applications web dynamiques en soulageant la charge de la base de données". Donc, lors du développement de votre application, rappelez-vous que vous devez avoir un mécanisme de secours pour récupérer les données une fois qu'elles ne sont pas trouvées sur le serveur Memcached.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X