session详解

session的由来

    http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态写协议所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的。而越来越复杂的WEB应用,需要保存一些用户状态信息。这时候,Session这种方案应需而生。PHP从4.1开始支持Session管理

session的作用

    存储各个用户的状态数据.

session的设计管理

1.session id
    用户session唯一标识符,随机生成的一串字符串,具有唯一性,随机性主要用于区分其它用户的session数据,用户第一次访问web页面的时候,php的session初始化函数调用会分配给当前来访用户一个唯一的ID,也称为session_id
2.session data
    我们把需要通过session保存的用户状态信息,称为用户session数据,也称为session数据
3.session file
    PHP默认将session数据存放在一个文件里,我们把存放session数据的文件称为 session文件,session文件存储的路径由php.ini中session.save_path指定,需要注意的是,如果将session文件的保存路径,指定到别的目录,需要保证指定目录必须有读写权限,否则无法回存session数据,如果指定的目录不存在,PHP是不会自动创建的,同样也可以写成"N;/path",其中N是整数,这样使得不是所有的session文件都保存在同一个目录中,而是分散在不同目录。这对于服务器处理大量session文件是很有帮助的。注意目录需要自己手工创建文件名称,以sess_为前缀,以session_id为结尾命名,比如sess_0aq4mt9nljk0q5ap3a66cdc9kj27oi10这样。
4.session lifetime
    我们把初始化session开始,直到注销session这段期间,称为session生命周期,当每个用户访问web,PHP的session初始化函数就会给当前来访用户分配一个唯一的sessionID并且在session生命周期结束的时候,将用户在此周期产生的session数据持久到session文件中,用户再次访问的时候,session初始化函数,又会从session文件中读取session数据,开始新的session生命周期

session文件的回收

    PHP GC进程被启动以后,则会扫描session.save_path,找出过期的session,并删除该session文件。所谓,过期的session,是指操作系统当前时间与session文件最后访问时间之差大于session.gc_maxlifetime的话,该session认为是过期了。注意:有时候,你会发现,即便是文件过期了,有可能也没有被及时地删除掉。这是因为,每次session初始化的时候,并不会都启动PHP GC进程的,启动GC进程会大大降低php的运行效率。所有一个启动概率,这个概率由php.ini设定session.gc_probability / session.gc_divisor二个设置决定,默认概率是1%(1/1000)。这意味着,每1000次用户请求中,会启动1次PHP GC回收session文件。

session_unset 和unset的区别
    在session生命周期,从当前session中注销全部session数据,让$_SESSION成为一个空数组。它与unset($_SESSION)的区别在于:unset直接删除$_SESSION变量,释放内存资源;另一个区别在于,session_unset()仅在session生命周期能够操作$_SESSION数组,而unset()则在整个页面(page)生命周期都能操作$_SESSION数组。session_unset()同样不进行任何IO操作,只影响$_SESSION数组。

session_destroy()
    如果说session_start()初始化一个session的话,而它则注销一个session。意味着session生命周期结束了。在session生命周期结整后,session_register, session_unset, session_register都将不能操作$_SESSION数组,而$_SESSION数组依然可以被unset()等函数操作。这时,session意味着是未定义的,而$_SESSION依然是一个全局变量,他们脱离了关映射关系。
通过session_destroy()注销session,除了结束session生命周期外,它还会删除sesion文件,但不会影响当前$_SESSION变量。即它会产生一个IO操作。
问题

在看session的生命周期的时候,说过 当用户再次访问的时候,session初始化函数,会直接到session文件中读取session数据,那么问题来了,那PHP是怎么判断该用户是再次访问呢?

    实际原理是这样的,用户通过浏览器访问网页,输入地址回车,浏览器发出请求,在发送之前浏览器会先搜索有效的Cookies记录封装在http请求头的Cookie字段一同发送出去,服务器接收到请求后,交给PHP处理,这时,session初始化函数如果在$_COOKIE中没有找到session_name()作为键值存储的元素(值为session id)则会以为用户是第一次访问,作为第一次访问的用户,session初始化函数就会机生成一个session_id并且通过setcookie()函数调用将新生成的session_id以”sesseson_name = session_id”的格式填入http响应头Set-Cookie字段,发送给客户端(这样接下来的请求,http请求头Cookie字段都会携带该Cookie记录给web服务器)。如果初始化函数发现用户端Cookies中已定义了存在$_COOKIE[‘sess_name’],则会加载与$_COOKIE[‘sess_name’]相对应的session文件($_COOKIE[‘sess_name’]就是session ID)。如果用户Cookie记录过期,则会被浏览器删除,之后的下一次请求,服务器会以为用户又是第一次访问,如此循环。一般session发出去的cookie属于即时cookie,保存在内存中,当浏览器关闭时,就会过期。我们也可以设置session的生存期,就是修改客户端cookie中session_name()的有效时间,setcookie(session_name(), session_id(), time() + 24 * 3600, "/");在PHP5 session中也提供了一个函数session_set_cookie_params();来设置PHP5 Session的生命期,需要注意的是,该函数必须在session_start()函数调用之前调用。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值