Au travail, nous faisons presque tout en Java et Perl, mais je voulais construire une fonctionnalité en utilisant PHP et les sessions. Certains peeps ont pensé que c'était une mauvaise idée d'essayer de faire des sessions PHP sur notre système, parce qu'il est distribué à de nombreux serveurs. Quel serait le problème spécifique?Les sessions PHP sont-elles difficiles à mettre à l'échelle sur un système distribué?
Répondre
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.
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).
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.
Ceci est une excellente réponse, et je vais utiliser cette approche. Merci! – woody121
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.
est plus facile memcached ou Redis.
ici est de savoir comment faire en Redis - nous l'utilisons à l'heure actuelle: http://redis4you.com/articles.php?id=001&name=Redis+as+session+handler+in+PHP
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
mais que se passe-t-il si les domaines sont dans des centres de données distincts? – Dannyboy