session 的持久化

有时候我们希望我们在关闭浏览器后,客户端cookie和服务器端session能不过期,那么下次访问的时候就不用再输入用户名和密码了,可以有很多种方法来延长session机制的有效时间。


首先session的持久化分客户端cookie和服务器端session(注意这里sessionid使用cookie存储,如果sessionid不用cookie的话,就无所谓持久化,每次关闭浏览器再次访问都要重新输入)。


客户端:

1、用session_set_cookie_params(),可以有很多参数,这里就只介绍第一个参数lifetime。只需要在session_start()之前调用该函数,并把lifetime的值设置长一点就行了(默认为0,即关闭浏览器则客户端清除cookie),那么下一次浏览器开启并访问的时候,如果cookie不过期那么就将sessionid带在请求头里发送到服务器。这样客户端的sessionid持久化就可以了


2、在session_start之后用setcookie(session_name(),session_id(),时间,作用域)来设置cookie的生存周期,这里时间可以自己设置。区别:对于session_set_cookie_params(), 如果客户端带过来sessionid,那么该函数就不会执行,它会受session控制,如果客户端没有sessionid带过来,那么说明客户端已经过期,此时session_start会重新生成sessionid,cookie的生命周期由该函数控制。但对于setcookie,它是完全独立的,如果客户端带sessionid过来,那么该函数会为cookie更新设置生命周期,如果不带那么会为服务器端新生成的sessionid在客户端的cookie设置生命周期。所以该函数会持续的为客户端cookie更新生命周期,例如如果客户端第一次访问,设置cookie周期为2天,那么只要客户端浏览器浏览给服务器的时间间隔不大于两天,那么该cookie就永不过期。


服务器端:

服务器端可以设置session.gc_maxlifetime 项,php.ini中,默认session的生命周期是24分钟,大于24分钟那么服务器的垃圾回收机制可能会把他删除(前提是垃圾回收机制启动,gc的启动也是有概率的默认是每一次session_start会有1/1000的概率启动,可以根据情况自己设置)。这里如果把它设置成无限大,那么就会永久的不过期(这样做没有意义,会导致session文件大部分都是垃圾)。


注意:在有些情况下,多个网站在一个服务器上,那么就会导致每一个网站的session声明周期不同,但gc不会区别该session文件属于谁的,所以设置大也没用。解决办法就是自定义session文件的存储位置,那么别的网站启动gc的时候不会扫描到你的目录上来(可以参看session的垃圾回收机制一文)。


针对服务器端,如果是文件存储方式可以考虑上边的方法,但非常的不灵活,而且容易产生很多的session文件垃圾,所以可以自定义存储方式,采用数据库存储,那么就会很灵活而且可以让它不会产生session文件垃圾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值