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 相关文章推荐
DISCUZ 论坛管理员密码忘记的解决方法
May 14 PHP
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
一些需要禁用的PHP危险函数(disable_functions)
Feb 23 PHP
解析PHP处理换行符的问题 \r\n
Jun 13 PHP
解析Linux下Varnish缓存的配置优化
Jun 20 PHP
php检测网页是否被百度收录的函数代码
Oct 09 PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
[原创]php实现 data url的图片生成与保存
Dec 04 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
php四种定界符详解
Feb 16 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 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面向对象分析设计的经验原则
2008/09/20 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
处理Python中的URLError异常的方法
2015/04/30 Python
Python 常用string函数详解
2016/05/30 Python
python查看列的唯一值方法
2018/07/17 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
进程的查看和调度分别使用什么命令
2013/12/14 面试题
自动化职业生涯规划书范文
2014/01/03 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
2014年网管工作总结
2014/12/11 职场文书
朋友聚会开场白
2015/06/01 职场文书
交通处罚决定书
2015/06/24 职场文书
追悼会家属答谢词
2015/09/29 职场文书
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL
Redis集群的关闭与重启操作
2021/07/07 Redis
Python绘制散乱的点构成的图的方法
2022/04/21 Python
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript