session一二事

时间:2024-01-05 23:15:44

Session即回话,指一种持续性的、双向的连接。Session和Cookie在本质上没有什么区别,都是针对HTTP协议的局限性而提出的一种保持客户端和服务器间保持会话连接状态的机制。

Session的实现可以有多种,如URL重写、Cookie,通过在Cookie中存储sessionID实现Session传递。

PHP 的 Session 默认是通过文件的方式实现。

Session通过一个称为 PHPSESSID 的 Cookie 和服务器联系。Session 是通过 sessionID 判断客户端用户的,即Session 文件的名称。

一个访问者访问你的 web 网站将被分配一个唯一的 id, 就是所谓的会话 id. 这个 id 可以存储在用户端的一个 cookie 中,也可以通过 URL 进行传递. Session会话用来追踪每个用户的会话,使用服务器生成的SessionID进行标识,用以区分用户。Session默认以文件的形式存放在服务器的磁盘目录中,SessionID存放在服务器内存和客户机的Cookie里面。这样,当用户发出请求时,服务器将用户Cookie里面记录的SessionID和服务器磁盘中的SessionID进行比对,从而找到这个用户对应的Session文件进行操作。所以,如果客户机禁止Cookie的话,Session也不能使用。
session_start()开启会话,生成session_id,再用session_id()输出:
session_start();
$session_id = session_id();
$_SESSION['name'] = 1;
通过已生成的session_id,开启会话,从而获取session中存储的值:
session_id($session_id);
session_start();
print_r($_SESSION['name']);
当session过多,一般磁盘文件数超过2000时,读写这个目录就会很慢。
1、可以做session文件的目录分级配置
session.save_path = "N;MODE;/path" 
N:表示要设置的目录级别,
MODE:表示目录的权限属性,默认是600,
/path:表示session文件存放的根目录路径
session.save_path ="1;f:/wamp64/tmp"
表示在f:/wamp64/tmp目录下再生成1个子目录来保存session文件,注意PHP默认是不会自动创建文件夹的,需手工创建(脚本),目录名以0~9和a~z共36个可选单字组成,如,f:/wamp64/tmp/a,26位的session_id根据第1位的字符去找到对应目录存储
如果使用子目录来存储会话文件,那么垃圾回收机制没法自动发生,可使用脚本,
如,find /path/to/sessions -cmin +24 -type f | xargs rm 
session回收机制(被动回收):
参数:
session.cookie_lifetime=0, 设定session_id在客户端cookie中的有效期限,单位秒,0表示到关闭浏览器,默认为0;
session.gc_maxlifetime=1440,设定session文件有效时间,单位秒
默认配置,当用户关闭浏览器,浏览器cookie中PHPSESSID失效清除,但服务器的sess_xxx文件并不会立马删除,
而是通过 当前时间减去session文件修改时间是否大于 gc.max_lifetime 来判断是否过期,若为true,则垃圾回收程序会清除session文件目录下所有过期的session文件。
失去客户端session_id引用的服务器session文件,不能在访问就一定会过期被清除,反之,若没有失去引用,只要用户有一个动作,哪怕是刷新,都会更新session文件的修改时间(前提是session文件要有数据)。
'garbage collection' process is started on every session initialization
注意,启动垃圾回收程序是在session_start()函数调用时,有一定概率(session.gc_probability/session.gc_divisor)触发的。