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'将使创建的会话文件和路径类似于下面的形式:
要使用 N 参数,必须在使用前先创建好这些目录。在 ext/session 目录下有个小的 shell 脚本,即 mod_files.sh。Windows 版本下的 mod_files.bat 可以用来做这件事。
此外,如果使用了 N 参数并且大于 0,那么将不会执行自动垃圾回收。文件储存模块默认使用 mode 600 创建文件。通过修改可选参数 MODE 来改变这种默认行为:
其中,MODE 是 mode 的八进制表示。
使用以上描述的可选目录层级参数 N 时请注意,对于绝大多数站点,大于 1 或者 2 的值会不太合适——因为这需要创建大量的目录。例如,值设置为 3 需要在文件系统上创建 64^3 个目录,将浪费很多空间和 inode。仅仅在绝对肯定站点足够大时才可以设置 N 大于 2。
一个 Session 文件的内容如下:
内容的格式为: