2008-11-01 4 views

Répondre

4

La réponse à votre question spécifique, quel serait le problème, réside dans le fait que par défaut PHP stocke ses sessions dans des fichiers sur le système de fichiers. Pour un seul serveur Web servant des requêtes, ce n'est pas un problème car vos données de session seront toujours disponibles. Mais que se passerait-il si vous utilisiez deux serveurs Web à charge équilibrée pour répondre aux demandes? Imaginez que vous tapiez sur le premier serveur Web avec une requête, ce qui crée votre fichier de session sur son système de fichiers. Ensuite, votre prochaine demande touche 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, et il est très courant. La solution consiste à stocker des 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 dans un serveur de mémoire cache partagé tel que memcached.

+0

Comme le mentionne @azkotoki ci-dessous, une partition partagée comme une monture NFS supportée par NAS fonctionne également. La bonne chose à ce sujet est qu'il n'implique pas de changements de code. Connectez simplement le répertoire de session local à NFS. – gerard

+0

mais que se passe-t-il si les domaines sont dans des centres de données distincts? – Dannyboy

4

Les sessions persistantes sur plusieurs serveurs (également appelées clustering de session) sont un problème courant pour la mise à l'échelle des applications Web et ne sont pas spécifiques à PHP. PHP propose plusieurs solutions pour le gérer, telles que Zend Platform (serveur d'applications commerciales) et Msession (extension).

10

Vous pouvez également utiliser une session personnalisée gestionnaire de sauvegarde:

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

Je n'ai jamais essayé, mais il vous définissez votre propre sauvegarde/fonctions de lecture, de sorte que vous pouvez mettre en œuvre une base de données ou un backend nfs partagé sans avoir besoin d'installer des extensions.

Aussi Msession, qui a été suggéré par @Eran Galperin, semble très intéressant comme une alternative à celui que j'ai mentionné auparavant.

+0

Ceci est une excellente réponse, et je vais utiliser cette approche. Merci! – woody121

0

Tout à fait une question vague, mais je dirais que le problème est plus grand que mentionné dans les réponses. Bien sûr, vous pouvez remplacer le chargement et l'enregistrement des cookies, mais cela a également un coût. Par exemple, vous devrez tenir compte des scénarios/questions suivants:

  • Si vous placez les cookies sur un autre hôte, quelle incidence cela aura-t-il sur la vitesse de vos cookies? Cela dépend évidemment du nombre d'écritures/lectures que vous faites.
  • Est-ce que vous faites cela pour augmenter la vitesse ou avoir un basculement? La réponse mènera certainement à différentes solutions:
    • Dans le cas où vous faites cela pour le basculement, comment allez-vous gérer si votre serveur web ne peut pas accéder à votre magasin de session parce que la liaison réseau tombe en panne? Que faire si votre magasin de sessions tombe en panne? Vous devrez résoudre ceci en utilisant une sorte de réplication maître-maître, en exécutant éventuellement ce magasin de sessions distribué sur la même machine que le serveur web pour une haute disponibilité supplémentaire (si toutes les sessions peuvent tenir dans la mémoire). Jetez un oeil à Riak ou similaire pour la réplication maître-maître.
    • Dans le cas où vous faites simplement cela pour la vitesse, j'utiliserais apache, nginx ou haproxy (le plus rapide) pour simplement équilibrer la charge en fonction de l'adresse IP du client. De cette façon, vous n'avez pas à vous soucier de la configuration d'un magasin de sessions 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.
Questions connexes