对于访问量大的网站,用默认的 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 存储机制的更多相关文章

  1. Session 知识点再整理(一)基本概念和原理

    Session 的概念 Session 和 Cookie 一样,也是针对 HTTP 的局限性而提出的一种保持客户端和服务器端会话连接状态的机制. Session 被称为会话,指用户在进入网站到浏览器关 ...

  2. Cookie 知识点再整理

    1. Cookie  是存储在客户端 内存 或者 硬盘(例如火狐把 Cookie 存储在 C:\Documents and Settings\用户名\Application Data\Mozilla\ ...

  3. 【ASP.NET Core】自定义Session的存储方式

    在开始今天的表演之前,老周先跟大伙伴们说一句:"中秋节快乐". 今天咱们来聊一下如何自己动手,实现会话(Session)的存储方式.默认是存放在分布式内存中.由于HTTP消息是无状 ...

  4. 可灵活扩展的自定义Session状态存储驱动

    Session是互联网应用中非常重要的玩意儿,对于超过单台部署的站点集群,都会存在会话共享的需求.在web.config中,微软提供了sessionstate节点来定义不同的Session状态存储方式 ...

  5. Asp.net Mvc 自定义Session (二)

    在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...

  6. php自定义session存储路径

    1.找到php.ini配置文件,找到session.save_path,修改如下: 其中2表示session存储的目录深度,也就是分目录,避免一个目录下文件太多,造成IO负担. session.sav ...

  7. Session与Cookie(自定义Session)

    一.会话管理 会话管理: 管理浏览器客户端 和 服务器端之间会话过程中产生的会话数据. 域对象: 实现资源之间的数据共享. request域对象 context域对象 会话技术: Cookie技术:会 ...

  8. java web 学习十二(session)

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  9. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

随机推荐

  1. VS2013单元测试及代码覆盖率分析--Xunit

    1,Javaweb中有jmeter.jacoco.ant.badboy等集成测试代码覆盖率的方式,C#代码的覆盖率怎么测试呢?VS2013的IDE上本身并未集成测试的工具,以下讲解VS2013中C#代 ...

  2. HDU4511 小明系列故事——女友的考验(AC自动机 + DP)

    题目大概说有平面有n个点,从1点出发走到n点,每一步只能走到序号比当前更大的点且走的序列不能包含给定的m个序列中的任何一个,问1走到n的最短路. 用m个序列建个AC自动机,后缀包含整个序列的结点标记一 ...

  3. 【转】如果成为一个牛比的BI售前

    转自:天善智能 没有最厉害,只有更厉害啊.也没有一定哪儿厉害,会因人定制各有不同啊.打个比方,如果你长得很庄重,年长,光头或布满银丝,然后以专业的态度,以饱满的激情去跟你客户宣讲,杀伤力巨大.所以,卖 ...

  4. django 数据库交互2

    打开django shell python manage.py shell 输入命令 >>> from myapp import * >>> MySite.obje ...

  5. BZOJ3583 : 杰杰的女性朋友

    将$I$转置,设$G=OI$,则$ans=G^0+G^1+...+G^d$. 注意到$G^d=O(IO)^{d-1}I$,而$IO$是大小为$k\times k$的矩阵,可以通过倍增在$O(k^3\l ...

  6. Storm分布式实时流计算框架相关技术总结

    Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...

  7. SAD算法在opencv上的实现代码(c++)

    #include <opencv2/opencv.hpp>#include <opencv2/core/core.hpp>#include <opencv2/highgu ...

  8. 【noiOJ】p8208

    03:切分矩形组 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给定若干个平行于坐标轴的互不重叠的矩形,矩形的顶点都是整点.要求画一根平行于y轴的直线x=k ...

  9. a little about hashtable vs dictionary

    使用Hashtable没有任何优点,因为在.net2.0以后已经被Dictionary<Tkey,TValue>所代替. 他们两者的区别是,根据stackoverflow Dictiona ...

  10. This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.

    一,经历 <1> 使用SDWebImage下载 成功图片后,将图片设置给 self.imageView.image,提示如题所示的错误提示. <2>第一反应就是慢慢注释掉代码进 ...