L'exemple de cet article décrit la méthode d'implémentation d'utilisation de Memcache pour partager des données de session dans thinkPHP avec plusieurs noms de domaine. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
1. Origine du problème
Les sites Web légèrement plus grands ont généralement plusieurs serveurs, chaque serveur exécute des modules avec des fonctions différentes, utilisez différents noms de domaine de deuxième niveau, mais pour un site Web hautement intégré, le système utilisateur est unifié, c'est-à-dire qu'un ensemble de noms d'utilisateur et de mots de passe peuvent être connectés et utilisés dans chaque module de l'ensemble du site Web. Il est relativement simple pour chaque serveur de partager les données utilisateur. Il vous suffit de mettre un serveur de base de données en back-end, et chaque serveur peut accéder aux données utilisateur via une interface unifiée. Mais il y a toujours un problème, c'est-à-dire qu'une fois que l'utilisateur s'est connecté à ce serveur, lorsqu'il accède à d'autres modules d'un autre serveur, il doit toujours se reconnecter. Il s'agit d'une connexion unique et tous les problèmes courants sont mappés. technologie. En fait, c'est entre différents serveurs. Comment partager les données de SESSION.
2. Le principe de fonctionnement de PHP SESSION
Avant de résoudre le problème, comprenons d'abord le principe de fonctionnement de PHP SESSION. Lorsque le client (comme un navigateur) se connecte au site Web, la page PHP visitée peut utiliser session_start() pour ouvrir la SESSION, ce qui générera l'identification unique du client SESSION ID (cet ID peut être obtenu/défini via la fonction session_id ()). L'ID de SESSION peut être conservé sur le client de deux manières, de sorte que lors de la requête de différentes pages, le programme PHP puisse apprendre l'ID de SESSION du client ; l'une consiste à ajouter automatiquement l'ID de SESSION à l'URL GET, ou au formulaire POST, par défaut ; . Ci-dessous, le nom de la variable est PHPSESSID ; l'autre consiste à enregistrer l'ID de SESSION dans le COOKIE via COOKIE. Par défaut, le nom de ce COOKIE est PHPSESSID. Ici, nous utilisons principalement la méthode COOKIE à des fins d’explication, car elle est largement utilisée.
Alors, où sont stockées les données de SESSION ? Côté serveur bien sûr, mais au lieu d'être sauvegardé en mémoire, il est sauvegardé dans un fichier ou une base de données. Par défaut, la méthode de sauvegarde SESSION définie dans php.ini est celle des fichiers (session.save_handler = files), c'est-à-dire que les données SESSION sont enregistrées en lisant et en écrivant des fichiers, et le répertoire dans lequel le fichier SESSION est enregistré est spécifié par session. save_path, et le nom du fichier commence par sess _ est le préfixe, suivi de SESSIONID, tel que : sess_c72665af28a8b14c0fe11afe3b59b51b. Les données du fichier sont les données SESSION après sérialisation. Si le nombre d'accès est important, davantage de fichiers SESSION peuvent être générés. Dans ce cas, vous pouvez configurer un répertoire hiérarchique pour enregistrer les fichiers SESSION, ce qui améliorera considérablement l'efficacité. La méthode de configuration est : session.save_path=". N;/save_path", N est hiérarchique. niveau, save_path est le répertoire de départ. Lors de l'écriture des données SESSION, PHP obtiendra le SESSION_ID du client, puis utilisera cet ID SESSION pour trouver le fichier SESSION correspondant dans le répertoire de stockage du fichier SESSION spécifié. S'il n'existe pas, créez-le, puis sérialisez les données et écrivez-les. le fichier . La lecture des données SESSION est un processus opérationnel similaire. Les données lues doivent être désérialisées et la variable SESSION correspondante est générée.
3. Les principaux obstacles et solutions au partage multi-serveur SESSION
En comprenant le principe de fonctionnement de SESSION, nous pouvons constater que par défaut, chaque serveur partagera le même client SESSIONID. Par exemple, pour le même navigateur utilisateur, l'ID de SESSION généré par le serveur A est 30de1e9de3192ba6ce2992d27a1b6a0a, tandis que l'ID de SESSION généré par le serveur B est c72665af28a8b14c0fe11afe3b59b51b. De plus, les données SESSION de PHP sont stockées séparément dans le système de fichiers de ce serveur.
Après avoir identifié le problème, vous pouvez commencer à le résoudre. Si vous souhaitez partager des données de SESSION, vous devez atteindre deux objectifs : Le premier est que l'ID de SESSION généré par chaque serveur pour le même client doit être le même et puisse être transmis via le même COOKIE, ce qui signifie que chaque serveur doit pouvoir lire le même ID de SESSION. Le COOKIE nommé PHPSESSID ; l'autre est la méthode/emplacement de stockage des données de SESSION qui doivent être accessibles à tous les serveurs. En termes simples, plusieurs serveurs partagent l'ID SESSION du client et doivent également partager les données SESSION du serveur.
La réalisation du premier objectif est en fait très simple. Il vous suffit de définir spécialement le domaine de COOKIE. Par défaut, le domaine de COOKIE est le nom de domaine/l'adresse IP du serveur actuel, et le domaine. S'ils sont différents, les COOKIE définis par chaque serveur ne peuvent pas accéder les uns aux autres. Par exemple, le serveur de www.aaa.com ne peut pas lire et écrire le COOKIE défini par le serveur de www.bbb.com. Les serveurs du même site dont nous parlons ici ont leur propre particularité, c'est-à-dire qu'ils appartiennent au même domaine de premier niveau. Par exemple : tieba.xiaoyuan.com et www.xiaoyuan.com appartiennent tous deux au domaine .xiaoyuan. .com, nous pouvons alors définir le domaine du COOKIE sur .xiaoyuan.com, afin que tieba.xiaoyuan.com, www.xiaoyuan.com, etc. puissent accéder à ce COOKIE. La méthode de paramétrage dans le code PHP est la suivante :
<?php ini_set('session.cookie_domain', '.xiaoyuan.com'); ?>
De cette façon, l'objectif de chaque serveur partageant le même ID de SESSION client est atteint.
Le deuxième objectif peut être atteint en utilisant le partage de fichiers. Il existe deux façons de le résoudre, l'une consiste à utiliser une session de stockage de données et l'autre est d'essayer Memcache. Utilisez MEMCACHE pour le résoudre ici.
J'utilise le framework thinkphp, qui prend déjà en charge l'accès memcache aux sessions. Après avoir configuré le serveur memcache, il vous suffit de définir l'IP et le port de memcache dans le fichier de configuration, puis de spécifier le paramètre COOKIE_DOMAIN. appuyez sur Fonctionner de la manière normale de faire fonctionner la session. À l'heure actuelle, la session peut être partagée par plusieurs noms de domaine
J'espère que cet article sera utile à la programmation PHP de chacun basée sur le framework ThinkPHP.
Pour plus de méthodes d'implémentation thinkPHP d'utilisation de memcache pour partager des données de session sous plusieurs noms de domaine, veuillez faire attention au site Web PHP chinois !