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产生随机数的两种方法实例代码 输出随机IP
Apr 08 PHP
php中global和$GLOBALS[]的分析之一
Feb 02 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
php实现分页显示
Nov 03 PHP
PHP开发中常用的十个代码样例
Feb 02 PHP
微信公众号开发之通过接口删除菜单
Feb 20 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 PHP
PHP自动载入类文件函数__autoload的使用方法
Mar 25 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 PHP
PHP RabbitMQ消息列队
May 11 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
ftp类(example.php)
2006/10/09 PHP
改进的IP计数器
2006/10/09 PHP
Zend 输出产生XML解析错误
2009/03/03 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
基于php双引号中访问数组元素报错的解决方法
2018/02/01 PHP
PHP学习记录之数组函数
2018/06/01 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
js实现移动端轮播图效果
2020/12/09 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
Python字符串中查找子串小技巧
2015/04/10 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
python安装后的目录在哪里
2020/06/21 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
.NET方向面试题
2014/11/20 面试题
党建示范点实施方案
2014/03/12 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
大学军训的体会
2014/11/08 职场文书
刑事和解协议书范本
2014/11/19 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
阿里云日志过滤器配置日志服务
2022/04/09 Servers