Session 知识点再整理(二) 自定义 Session 存储机制
对于访问量大的网站,用默认的 Session 存储方式(以文件存储)不适合,因为文件的 I/O 开销会非常大,另外 Session 机制本身使 Session 不能跨机访问,在 Web 集群中无法达到跟踪用户的目的。
此时可以考虑使用 NFS 或 SAMBA 等共享技术把 Session 保存到其他服务器中。
也可以使用数据库(使用普通存储引擎或者 Memory 引擎)、内存服务器(结合关系型数据库)等方式来存储 Session,需要使用 session_get_save_handler() 函数来设置用户自定义会话存储函数,以代替默认的 php.ini 中的 session.save_handler 配置,该配置的默认值是:
session.save_handler = files
要使用自定义的方式处理 Session 的存储时需要修改该配置:
session.save_handler = user
session_get_save_handler() 方法的结构是:
bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid ] )
在 PHP 5.4 以后还可以使用以下方式:
bool session_set_save_handler ( SessionHandlerInterface $sessionhandler [, bool $register_shutdown = true ] )
其中接口 SessionHandlerInterface 如下:
SessionHandlerInterface {
/* 方法 */
abstract public bool close ( void )
abstract public bool destroy ( string $session_id )
abstract public bool gc ( int $maxlifetime )
abstract public bool open ( string $save_path , string $name )
abstract public string read ( string $session_id )
abstract public bool write ( string $session_id , string $session_data )
}
以第 1 种方式为例,它有 6 个回调函数作为必选参数,分别代表了 Session 生命周期的 6 个过程,通过自定义这个函数来设置 Session 生命周期中的每个过程。
session_set_save_handler 的回调函数说明:
| 回调函数 | 执行时机 | 描述 |
| open | 调用 session_start() 时执行 | 该函数需要声明两个参数,系统会自动将 php.ini 中 session.save_path 选项的值传递给第一个参数,将 Session Name 传递给第二个参数,返回 True 则自动向下执行 |
| close | 调用 session_write_close() 或 session_destroy() 时执行 | 不需要参数,在所有的 session 操作完之后被执行。如果不需要处理,直接返回 True 即可。 |
| read | 调用 session_start() 时执行 | 开启会话时,会去根据 Cookie 或 URL 中的 Session ID 来 read 当前 Session 数据,该函数需要一个参数,系统会自动将 Session ID 传递给该函数,并且通过 Session ID 获取对应的 $_SESSION 中的数据。该函数返回当前的会话信息 $_SESSION |
| write | 调用 session_write_close() 时执行 | 需要声明两个参数,分别是 Session ID 和 串行化后的 Session 信息字符串。在对 Session 变量进行赋值时,通过 Session ID 找到相应的存储位置,并将信息写入。存储成功后返回 True 继续向下执行。 |
| destroy | 调用 session_destroy() 时执行 | 需要一个参数,系统会自动将 Session ID 传给该函数,删除当前用户对应的 Session 文件 以及释放 session |
| gc | 调用 session_start() 时执行 | 需要声明一个参数,系统会将 php.ini 中的 session.gc_maxlifetime 选项的值传给该参数,用于删除超过该值代表的时间的 Session 文件。返回 True 则会自动向下执行。 |
注意:调用 session_destroy() 销毁的是 Session 文件和数据;但是在回调函数中,销毁的只是 Session 的数据,如果此时输出 $_SESSION,仍然有值,但是该值不会在回调函数 close 执行时再被写回去。
实际使用的例子参见《Memcached 笔记与总结(9)Memcached 与 Session》
Session 知识点再整理(二) 自定义 Session 存储机制的更多相关文章
- Session 知识点再整理(一)基本概念和原理
Session 的概念 Session 和 Cookie 一样,也是针对 HTTP 的局限性而提出的一种保持客户端和服务器端会话连接状态的机制. Session 被称为会话,指用户在进入网站到浏览器关 ...
- Cookie 知识点再整理
1. Cookie 是存储在客户端 内存 或者 硬盘(例如火狐把 Cookie 存储在 C:\Documents and Settings\用户名\Application Data\Mozilla\ ...
- 【ASP.NET Core】自定义Session的存储方式
在开始今天的表演之前,老周先跟大伙伴们说一句:"中秋节快乐". 今天咱们来聊一下如何自己动手,实现会话(Session)的存储方式.默认是存放在分布式内存中.由于HTTP消息是无状 ...
- 可灵活扩展的自定义Session状态存储驱动
Session是互联网应用中非常重要的玩意儿,对于超过单台部署的站点集群,都会存在会话共享的需求.在web.config中,微软提供了sessionstate节点来定义不同的Session状态存储方式 ...
- Asp.net Mvc 自定义Session (二)
在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...
- php自定义session存储路径
1.找到php.ini配置文件,找到session.save_path,修改如下: 其中2表示session存储的目录深度,也就是分目录,避免一个目录下文件太多,造成IO负担. session.sav ...
- Session与Cookie(自定义Session)
一.会话管理 会话管理: 管理浏览器客户端 和 服务器端之间会话过程中产生的会话数据. 域对象: 实现资源之间的数据共享. request域对象 context域对象 会话技术: Cookie技术:会 ...
- java web 学习十二(session)
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
随机推荐
- Scau 8633 回文划分 mancher + dp
时间限制:1000MS 内存限制:1000K 提交次数: 通过次数: 题型: 编程题 语言: G++;GCC Description 我们说一个字符串是回文串,那么意味着这个串从两边读起来的字母都是一 ...
- 转 Delphi中使用FastMM4结合View CPU避免内存泄漏
http://www.cnblogs.com/kongchao/archive/2009/10/27/1590479.html 核心提示:内存泄漏经常出现在本地代码中,特别是多线程和发生异常的情况下, ...
- 简单的jQuery扩展函数-让函数缓冲执行
$.fn.retarder = function(delay, method) { var node = this; if (node.length) { if (node[0]._timer_) c ...
- IDE-Sublime【1】-JsFormat插件格式化缩进问题
JsFormat插件格式化Javascript代码的快捷键是ctrl+alt+f,发现默认缩进2个空格,但习惯上是4个空格,这里需要手动设置一下. 操作步骤: 1.打开Preferences-> ...
- POJ3613 Cow Relays(矩阵快速幂)
题目大概要求从起点到终点恰好经过k条边的最短路. 离散数学告诉我们邻接矩阵的k次幂就能得出恰好经过k条路的信息,比如POJ2778. 这题也一样,矩阵的幂运算定义成min,而min满足结合律,所以可以 ...
- webservice 学习笔记
1.webservice的概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...
- SIFT特征提取分析
SIFT特征提取分析 sift 关键点,关键点检测 读'D. G. Lowe. Distinctive Image Features from Scale-Invariant Keypoints[J] ...
- 【Linux程序设计】之进程控制&守护进程
这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的. 实验题目:Linux环境下的进程控制 实验目的:熟悉并掌握Linux环境下进程的相关函数的应用:守护进程的概 ...
- aspx与ashx
ashx在VS的中文版是新建“一般处理程序”,其实是一个实现类System.Web.IHttpHandler接口的类.而任何一个实现了IHttpHandler接口的类都能作为一个外部请求的目标程序.H ...
- 20161004 NOIP 模拟赛 T1 解题报告
第1题 小麦亩产一千八 [问题描述] “有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾……”,话说HYSBZ(Hengyang School for Boys & Zy) ...