谈谈session

March 15, 2016

做互联网开发的同学,想必都对session有所了解。session我们可以理解为是一个会话,能确定服务的访问者当前的状态或者身份,也可以理解为是当前访问者的一些相关数据。最近由于项目中碰到了一些关于session处理的内容,索性将session相关的东西总结下,以备将来回顾。

什么是session

在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。

session的工作机制

session的工作机制大致如下图所示: session的工作机制

  1. 客户端发出请求
  2. 服务端获取客户端cookies,根据session id获取对应的session
  3. 如果没有session id则生成session_id
  4. 将session_id下发给客户端,客户端保存至cookies中,以备下次使用

以PHP为例,每次我们执行完脚本后会将当前会话的session信息全部重写一遍,所以我们就不用担心在使用的过程中session过期情况的。

session的生命周期

session的生命周期针对各个语言,平台,相差不会很大。这里以PHP为例,做一些说明 PHP中session的生命周期相关到几个callback

  • open,open 回调函数类似于类的构造函数, 在会话打开的时候会被调用。 这是自动开始会话或者通过调用 session_start() 手动开始会话 之后第一个被调用的回调函数。 此回调函数操作成功返回 TRUE,反之返回 FALSE。
  • close,close 回调函数类似于类的析构函数。 在 write 回调函数调用之后调用。 当调用 session_write_close() 函数之后,也会调用 close 回调函数。 此回调函数操作成功返回 TRUE,反之返回 FALSE。
  • read,如果会话中有数据,read 回调函数必须返回将会话数据编码(序列化)后的字符串。 如果会话中没有数据,read 回调函数返回空字符串。
  • write,在会话保存数据时会调用 write 回调函数。 此回调函数接收当前会话 ID 以及 $_SESSION 中数据序列化之后的字符串作为参数。 序列化会话数据的过程由 PHP 根据 session.serialize_handler 设定值来完成。
  • destroy,当调用 session_destroy() 函数, 或者调用 session_regenerate_id() 函数并且设置 destroy 参数为 TRUE 时, 会调用此回调函数。此回调函数操作成功返回 TRUE,反之返回 FALSE。
  • gc,为了清理会话中的旧数据,PHP 会不时的调用垃圾收集回调函数。 调用周期由 session.gc_probability 和 session.gc_divisor 参数控制。 传入到此回调函数的 lifetime 参数由 session.gc_maxlifetime 设置。 此回调函数操作成功返回 TRUE,反之返回 FALSE。
  • create_sid,当需要新的会话 ID 时被调用的回调函数。 回调函数被调用时无传入参数, 其返回值应该是一个字符串格式的、有效的会话 ID。

流程如下: session的生命周期

至此,相信大家对session已经有了个整体的了解。

Comments