Question

Au travail, nous faisons presque tout en Java et en Perl, mais je voulais créer une fonctionnalité utilisant PHP et des sessions. Certains ont pensé que c'était une mauvaise idée d'essayer de faire des sessions PHP sur notre système, car elles étaient distribuées sur de nombreux serveurs. Quel serait le problème spécifique?

Était-ce utile?

La solution

La réponse à votre question précise, quel serait le problème, réside dans le fait que, par défaut, PHP stocke ses sessions dans des fichiers du système de fichiers. Cela ne pose pas de problème pour un serveur Web unique, car vos données de session seront toujours disponibles. Mais que se passe-t-il si vous avez deux serveurs Web à charge équilibrée répondant aux requêtes?

Imaginez que le premier serveur Web reçoive une demande, ce qui crée votre fichier de session sur son système de fichiers. Ensuite, votre prochaine demande frappe le deuxième serveur Web. Le deuxième serveur Web ne verra bien sûr pas le fichier de session. Pour l'utilisateur, vous pouvez vous connecter à un site Web, puis soudainement être déconnecté.

Ce n'est pas un problème spécifique à PHP, il est très courant. La solution consiste à stocker les données de session dans une zone commune. La méthode la plus courante consiste à stocker les données de session dans une base de données accessible à tous les serveurs Web ou à un serveur de mémoire cache partagée tel que memcached.

Autres conseils

Vous pouvez également utiliser un gestionnaire de sauvegarde de session personnalisé:

http://www.php.net/ manual / fr / function.session-set-save-handler.php

Je ne l'ai jamais essayé, mais vous définissez ici vos propres fonctions de sauvegarde / lecture. Vous pouvez donc implémenter une base de données ou un back-end nfs partagé sans avoir à installer d'extensions.

Aussi, Msession, qui a été suggéré par @Eran Galperin, semble très intéressant comme alternative à celle que j'ai mentionnée précédemment.

La persistance de sessions sur plusieurs serveurs (également appelée mise en cluster de sessions) est un problème courant pour la mise à l'échelle d'applications Web et n'est pas spécifique à PHP. PHP propose plusieurs solutions pour le gérer, telles que la Zend Platform (serveur d'applications commerciales) et Msession (extension).

Question assez vague, mais je dirais que le problème est plus grave que ce qui est mentionné dans les réponses. Bien sûr, vous pouvez modifier le chargement et l’enregistrement des cookies, mais cela a également un coût. Par exemple, vous devrez envisager les scénarios / questions suivants:

  • Si vous installez les cookies sur un autre hôte, en quoi cela affectera-t-il la vitesse de vos cookies? Cela dépend évidemment du nombre d'écritures / lectures que vous faites.
  • Faites-vous cela pour augmenter la vitesse ou avoir un basculement? La réponse mènera certainement à différentes solutions:
    • Si vous effectuez cette opération pour le basculement, comment vous y prendre si votre serveur Web ne peut pas accéder à votre magasin de sessions car la liaison réseau est en panne? Que faire si votre magasin de session tombe en panne? Vous devrez résoudre ce problème en utilisant une sorte de réplication maître-maître, en exécutant éventuellement ce magasin de sessions distribuées sur le même ordinateur que le serveur Web pour une disponibilité extrêmement élevée (si toutes les sessions peuvent tenir dans la mémoire). Consultez Riak ou similaire pour la réplication maître-maître.
    • Dans le cas où vous ne feriez que cela pour plus de rapidité, j'utiliserais apache, nginx ou haproxy (le plus rapide) pour effectuer un équilibrage de charge basé sur l'adresse IP du client. De cette façon, vous n'avez pas à vous préoccuper de la configuration d'un magasin de session distribué. Bien sûr, si l'une de vos instances PHP tombe en panne, vos utilisateurs perdront leurs cookies, mais ce n'est peut-être pas un problème. C'est à vous.

plus facile est memcached ou redis.

voici comment le faire dans redis - nous l’utilisons pour le moment: http://redis4you.com/articles.php ? id = 001 & name = Redis + as + session + gestionnaire + en + PHP

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top