Maison >php教程 >PHP开发 >Trois façons d'implémenter des sessions sur des sous-domaines en PHP

Trois façons d'implémenter des sessions sur des sous-domaines en PHP

高洛峰
高洛峰original
2016-12-24 09:09:201224parcourir

Quand je faisais des choses auparavant, la session était généralement stockée directement dans la base de données, afin qu'elle puisse résoudre le problème du cross-domain et pas seulement du cross-sous-domaine. Cependant, le problème que j'ai rencontré aujourd'hui était que je devais le faire. apporter des modifications aux choses existantes d'autres personnes. Comme il ne s'agissait que d'un sous-domaine, j'ai pensé qu'il devait y avoir une solution simple. Du Niang a trouvé trois solutions :

La session est principalement divisée en deux parties :

L'une est les données de session, ces données sont stockées par défaut dans le fichier tmp du serveur et existent sous forme de fichier.

L'autre est l'ID de session qui marque les données de session. L'ID de session est le nom du fichier de session. L'ID de session est généré de manière aléatoire, il peut donc garantir l'unicité et le caractère aléatoire et garantir le fonctionnement. sécurité de la séance. Généralement, si la durée de vie de la session n'est pas définie, l'ID de session est stocké dans la mémoire. Après la fermeture du navigateur, l'ID est automatiquement déconnecté. Après une nouvelle demande de page, un nouvel ID de session est enregistré. Si le client ne désactive pas les cookies, le cookie joue le rôle de stockage de l'ID de session et de la durée de vie de la session lors du démarrage de la session de session.

Deux sites Web de noms de domaine différents souhaitent utiliser la même session, ce qui implique des problèmes inter-domaines de session !

Par défaut, chaque serveur générera un SESSIONID pour le même client. Par exemple, pour le même navigateur utilisateur, l'ID de SESSION généré par le serveur A est 11111111111, tandis que l'ID de SESSION généré par le serveur B. est 222222. De plus, les données SESSION de PHP sont stockées séparément dans le système de fichiers de ce serveur. 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 peut être transmis via le même COOKIE, c'est-à-dire qu'il est dit que chaque serveur doit être capable de lire le même COOKIE nommé PHPSESSID ;

L'autre est que la méthode/l'emplacement de stockage des données de SESSION doit garantir que chaque serveur peut y accéder. En termes simples, ces deux objectifs sont que plusieurs serveurs (serveurs A et B) partagent l'ID de SESSION du client et qu'ils doivent également partager les données de SESSION du serveur.

Il existe trois solutions :

1 Faites simplement ce qui suit au tout début de la page php (avant toute sortie, et avant session_start()) Set <.>

ini_set(&#39;session.cookie_path&#39;, &#39;/&#39;);
ini_set(&#39;session.cookie_domain&#39;, &#39;.mydomain.com&#39;);
ini_set(&#39;session.cookie_lifetime&#39;, &#39;1800&#39;);

2. Définissez

session.cookie_path = /
session.cookie_domain = .mydomain.com
session.cookie_lifetime = 1800
dans php.ini

3. Appelez la fonction

session_set_cookie_params(1800 , &#39;/&#39;, &#39;.mydomain.com&#39;);
au tout début de la page php (les conditions sont les mêmes que 1)

session a Session_id comme seul identifiant de la session .


Pour implémenter le sous-domaine Session, en effet, lors de l'accès à deux sous-domaines A et B dans le même navigateur, leurs sessions sont les mêmes.


La session étant stockée côté serveur, comment les deux serveurs peuvent-ils identifier que ces deux requêtes sont émises par un seul navigateur ?


Les cookies sont enregistrés sur le client. Le serveur identifie généralement différents clients via des cookies. Par conséquent, vous pouvez utiliser des cookies pour enregistrer Session_id et définir le cookie comme domaine parent.


Par exemple, lors de la visite de a.sso.com, le session_id est enregistré dans le cookie. Lors de l'accès à b.sso.com, le session_id est retiré du Cookie,


et la session est obtenue à partir d'un conteneur de persistance via le session_id.


Par exemple, lors de la visite de a.sso.com, le session_id est enregistré dans le cookie. Lors de l'accès à b.sso.com, le session_id est retiré du cookie,


et la session est obtenue à partir d'un conteneur de persistance via le session_id.


Dans cette expérience, PHP est utilisé comme langage expérimental.


Lors de la visite de a.sso.com, le session_id sera enregistré dans le cookie via


session_start();
 $_SESSION[&#39;person&#39;] = "SBSBSBS";
 $session_id = session_id();
 setcookie(&#39;name&#39;,$session_id,time()+3600*24,&#39;/&#39;,&#39;SSO.com&#39;);

milieu.


Puisque la session est un tableau en PHP, PHP a la fonction serialize() pour sérialiser le tableau

$session_value = serialize($_SESSION);

Puis enregistrez $session_value dans la base de données.


Lors de la visite de b.sso.com, le session_id est obtenu à partir du cookie, puis la session sérialisée est obtenue à partir de la base de données selon le session_id


Ensuite, vous peut exploiter la session pour réaliser la session inter-sous-domaines.


La sauvegarde de la session dans la base de données étant une opération fastidieuse, l'accès peut se faire dans un cache, comme memcached ou redis,


De cette façon , l'accès à la session est plus rapide.


Un autre avantage de l'utilisation du cache est que la session a généralement une certaine durée de survie. Si elle existe dans la base de données, la durée de survie de la session doit être enregistrée lors de la suppression de la session. Il faut déterminer s'il a expiré.


L'utilisation du cache pour stocker les sessions vous permet de définir leur durée de survie pendant le stockage, réduisant ainsi le processus de jugement d'invalidation après la récupération.

Ma solution est d'ajouter le code suivant à l'entrée :

ini_set(&#39;session.cookie_path&#39;, &#39;/&#39;);
 
 ini_set(&#39;session.cookie_domain&#39;, &#39;.jb51.net&#39;); //注意jb51.net换成你自己的域名
 
ini_set(&#39;session.cookie_lifetime&#39;, &#39;1800&#39;);

Site 2

Trois façons dimplémenter des sessions sur des sous-domaines en PHP

Vous pouvez voir que les PHPSESSID des deux sites sont les mêmes, ce qui bien sûr résout également le problème des noms de sous-domaines croisés

Ce qui précède explique comment réaliser cross-sous-domaines de sessions en PHP Plusieurs solutions, j'espère qu'elles pourront aider tous ceux qui en ont besoin.

Pour plus d'articles sur les trois méthodes d'implémentation de session multi-sous-domaines en PHP, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn