对于访问量大的网站,用默认的 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. Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  2. hdu 1059 Dividing

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  3. SlidesJS的使用

    项目中对slideshow要求要有触屏滑动换图功能,就想到了SlidesJS这个Jquery插件 例排,先把静态html写好 <div id="cm_slides"> ...

  4. three.js光源

    在Threejs中,光源用Light表示,它是所有光源的基类.它的构造函数是: THREE.Light ( hex ) 它有一个参数hex,接受一个16进制的颜色值.例如要定义一种红色的光源,我们可以 ...

  5. Linux chkconfig 命令详解

    一.简介 chkconfig 命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 二.安装&启动 us ...

  6. BZOJ3257 : 树的难题

    设$f[x][i][j]$表示以$x$为根的子树,与$x$连通部分有$i$个黑点,$j$个白点,不联通部分都是均衡的最小代价.若$i>1$,则视作$1$:若$j>2$,则视作$2$. 然后 ...

  7. mysql的关于TABLE_SCHEMA的sql语句和nformation_schema表

    1.查询sjcenter数据库里开头为sj_demo和sj_onlyinv的所有表的总条数 select sum(table_rows) from (select table_name,table_r ...

  8. 微软曝光眼球追踪新专利,未来或将可以使用眼球控制HoloLens

    想要在增强现实(AR)和虚拟现实(VR)中获得感官能力,计算机的配合非常重要.如何能够更好的追踪我们所感知的,计算机判断用户目光所向的能力就必须进一步提高.根据微软新曝光的专利,可能已经有一个解决方案 ...

  9. Codeforces Round #243 (Div. 2) C. Sereja and Swaps

    由于n比较小,直接暴力解决 #include <iostream> #include <vector> #include <algorithm> #include ...

  10. 洛谷 P1074 靶形数独 Label:search 不会

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...