php实现session共享的实例方法


Posted in PHP onSeptember 19, 2019

为什么要session共享?

现在稍微大一点的网站基本上都有好几个子域名,比如www.xz577.com, xz577.com, vip.xz577.com,这些网站如果需要共用用户登录信息,那么就需要做到session共享,当然前提是有相同的主域名。

PHP的session原理?

客户端访问php页面,执行session_start,生成session_id,一般我们是把session_id存储到cookie上,session内容保存在服务端,

客户端访问访问不同的页面都会把session_id传到服务端,通过session_id来获取session内容。

流程是这样,可是不同的服务器会对同一个客户端产生不同的session_id,这样的话不同服务器就不能得到相同的session内容。

而且PHP 默认的 SESSION 数据都是分别保存在本服务器的文件系统中。

所以我们要解决session共享,就必须解决两个问题:

多台服务器用同一个session_id

这个比较容易解决,只要在php中设置存session_id的cookie域名为网站主域就可以

打开PHP.ini, 设置session.cookie_domain = .feiniu.com,

当然也可以在php代码当中设置ini_set("session.cookie_domain","feiniu.com");

多台服务器用同一个session_id访问到相同的session内容

要实现这点,就必须把session内容存储到让所有服务器都能访问到的地方,php的session内容是默认存储到本服务器的文件中的,

一般的解决方案是存入数据库,memcache或者redis这种缓存服务器,当然用默认的文件存储方式也可以,用NFS统一存储。

如何选择存储引擎?

默认文件存储:

这种方式的session销毁依托于php垃圾收集器,在高并发或销毁时间较长的情况下,在SESSION目录下产生大量文件,当然可以设置

分级目录进行 SESSION 文件的保存。

这会导致两个问题:第一、查找文件慢;第二,每个目录下可容纳的文件数是有限的,可能会导致新SESSION储存失败。

数据库存储:

把Session存储在数据库里可以防止Session数据被垃圾收集器删除,可以固化存储session数据。

但是用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。

memcache存储:

以这种方式来同步session,不会加大数据库的负担,并且安全性比较高,把session放到内存里面,比从文件中读取要快很多。

但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,

如果存储块不足,还会产生内存溢出。

那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统

效率,因为网络连接同样需要资源。

redis存储:与memcache相比,redis访问稍稍慢一点点,好处是:

redis支持的数据结构较多,可以存储数组或对象,而memcache只能存储字符串。

在session机器重启的情况下,memcache所有用户都必须重新获得 session,而redis不会。3.在突然涌来大量用户产生了很多数据把

存储 session 的机器内存占满了的情况下,memcache会罢工,所有key都没过期的话就不停的覆盖最后写入的数据,而redis只是会变

慢,不会影响程序的逻辑

PHP 相关文章推荐
PHP生成带有雪花背景的验证码
Oct 09 PHP
PHP 解决utf-8和gb2312编码转换问题
Mar 18 PHP
php 过滤器实现代码
Aug 09 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
PHP函数getenv简介和使用实例
May 12 PHP
分享最受欢迎的5款PHP框架
Nov 27 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
解决php extension 加载顺序问题
Aug 16 PHP
php进行md5加密简单实例方法
Sep 19 #PHP
php解决安全问题的方法实例
Sep 19 #PHP
PHP中16个高危函数整理
Sep 19 #PHP
php实例化一个类的具体方法
Sep 19 #PHP
PHP递归统计系统中代码行数
Sep 19 #PHP
PHP实现统计代码行数小工具
Sep 19 #PHP
php设计模式之观察者模式定义与用法经典示例
Sep 19 #PHP
You might like
浅析PHP文件下载原理
2014/12/25 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
几种tab切换详解
2017/02/03 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
python 列表推导式使用详解
2019/08/29 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
拖鞋店创业计划书
2014/01/15 职场文书
超市促销活动方案
2014/03/05 职场文书
新学期开学演讲稿
2014/05/24 职场文书
小学课外阅读总结
2014/07/09 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
单位车辆管理制度
2015/08/05 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis