Maison  >  Article  >  développement back-end  >  Comment implémenter le partage de session en php

Comment implémenter le partage de session en php

(*-*)浩
(*-*)浩original
2019-09-19 14:42:234478parcourir

Pourquoi avez-vous besoin du partage de session ?

De nos jours, les sites Web légèrement plus grands ont essentiellement plusieurs sous-domaines, tels que www.feiniu.com, search.feiniu.com, member .feiniu.com, si ces sites Web doivent partager les informations de connexion des utilisateurs, ils doivent bien sûr partager des sessions, le principe est qu'ils ont le même nom de domaine principal.

Comment implémenter le partage de session en php

Le principe de session de PHP ?

Le client accède à la page php, exécute session_start et génère le session_id Généralement, nous stockons le session_id Sur le cookie, le contenu de la session est enregistré sur le serveur.

Lorsque le client accède à différentes pages, le session_id sera transmis au serveur et le contenu de la session pourra être obtenu via le session_id. (Apprentissage recommandé : Programmation PHP de l'entrée à la maîtrise)

Le processus est comme ceci, mais différents serveurs généreront des session_ids différents pour le même client, donc différents serveurs ne peuvent pas obtenir la même session session_id contenu.

Et les données SESSION par défaut de PHP sont stockées séparément dans le système de fichiers de ce serveur.

Donc, si nous voulons résoudre le partage de session, nous devons résoudre deux problèmes :

Plusieurs serveurs utilisent le même session_id

这个比较容易解决,只要在php中设置存session_id的cookie域名为网站主域就可以
打开PHP.ini, 设置session.cookie_domain = .feiniu.com, 
当然也可以在php代码当中设置ini_set("session.cookie_domain","feiniu.com");

Plusieurs serveurs utilisent le même session_id pour accéder au même contenu de session

要实现这点,就必须把session内容存储到让所有服务器都能访问到的地方,php的session内容是默认存储到本服务器的文件中的,
一般的解决方案是存入数据库,memcache或者redis这种缓存服务器,当然用默认的文件存储方式也可以,用NFS统一存储。

Comment choisir un moteur de stockage ?

Par défaut Stockage de fichiers :

这种方式的session销毁依托于php垃圾收集器,在高并发或销毁时间较长的情况下,在SESSION目录下产生大量文件,当然可以设置
分级目录进行 SESSION 文件的保存。
这会导致两个问题:第一、查找文件慢;第二,每个目录下可容纳的文件数是有限的,可能会导致新SESSION储存失败。

Stockage de base de données :

把Session存储在数据库里可以防止Session数据被垃圾收集器删除,可以固化存储session数据。
但是用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。

stockage memcache :

以这种方式来同步session,不会加大数据库的负担,并且安全性比较高,把session放到内存里面,比从文件中读取要快很多。
但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,
如果存储块不足,还会产生内存溢出。
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统
效率,因为网络连接同样需要资源。

stockage redis : Par rapport à Memcache, l'accès à Redis est légèrement plus lent. Les avantages sont :

redis支持的数据结构较多,可以存储数组或对象,而memcache只能存储字符串。
在session机器重启的情况下,memcache所有用户都必须重新获得 session,而redis不会。3.在突然涌来大量用户产生了很多数据把
存储 session 的机器内存占满了的情况下,memcache会罢工,所有key都没过期的话就不停的覆盖最后写入的数据,而redis只是会变
慢,不会影响程序的逻辑
.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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