首页 > 编程笔记 > PHP笔记

PHP Session的工作原理和存储机制

Session 是通过一个名为 PHPSESSID 的 Cookie 来和服务器取得联系的,Session 通过 sessionID(PHPSESSID 的值)来找到对应服务器中 Session 的文件名。

sessionID 是在客户端和服务端通过 HTTP Requset 和 HTTP Response 传来传去的。sessionID 按照一定的算法生成,保证其值的唯一性和随机性。

Cookie 里存储着 Session 的 sessionID 和 Session 的生存期,如果没有设置 Session 的生存期,则 sessionID 存储在内存中,关闭浏览器时 Session 失效,重新请求页面时会重新注册一个 sessionID。

默认情况下,Session 是存储在服务器硬盘上的,在 php.ini 中可通过 session.save_path 设置 Session 文件的存储路径,默认为服务器上的 /tmp 目录。

session.save_path 配置指令还有一个可选的 N 参数来决定会话文件分布的目录深度,例如设定为'5;/tmp'将使创建的会话文件和路径类似于下面的形式:

/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If

要使用 N 参数,必须在使用前先创建好这些目录。在 ext/session 目录下有个小的 shell 脚本,即 mod_files.sh。Windows 版本下的 mod_files.bat 可以用来做这件事。

此外,如果使用了 N 参数并且大于 0,那么将不会执行自动垃圾回收。文件储存模块默认使用 mode 600 创建文件。通过修改可选参数 MODE 来改变这种默认行为:

N;MODE;/path

其中,MODE 是 mode 的八进制表示。

使用以上描述的可选目录层级参数 N 时请注意,对于绝大多数站点,大于 1 或者 2 的值会不太合适——因为这需要创建大量的目录。例如,值设置为 3 需要在文件系统上创建 64^3 个目录,将浪费很多空间和 inode。仅仅在绝对肯定站点足够大时才可以设置 N 大于 2。

一个 Session 文件的内容如下:

siteadmin_username|s:7:"special";siteadmin_truename|s:6:"特殊";siteadmin_usertype|i:1;

内容的格式为:

session 名 | 值类型 : 长度 : 值;

所有教程

优秀文章