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代码
Mar 08 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
Mar 27 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
PHP调用Linux命令权限不足问题解决方法
Feb 07 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
Dec 18 PHP
PHP+Ajax验证码验证用户登录
Jul 20 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 PHP
PHP实现的函数重载功能示例
Aug 03 PHP
PHP children()函数讲解
Feb 03 PHP
phpinfo无法显示的原因及解决办法
Feb 15 PHP
Laravel 关联模型-关联新增和关联更新的方法
Oct 10 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过滤危险html代码的函数
2008/07/22 PHP
php入门之连接mysql数据库的一个类
2012/04/21 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
javascript实现计算器功能
2020/03/30 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
python如何查看系统网络流量的信息
2016/09/12 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
python创建文本文件的简单方法
2020/08/30 Python
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
青年文明号事迹材料
2014/01/18 职场文书
物理教学随笔感言
2014/02/22 职场文书
产假请假条
2014/04/10 职场文书
职位说明书范文
2014/05/07 职场文书
排查整治工作方案
2014/06/09 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers