天天看点

php 会话管理(SESSION管理)

关于会话的个人理解:当你打开一个网站后,在一个有效期内(会话有效期内)进行的一系列操作,这是一个会话的完整过程,如何理解呢。

1.不登录情况下的会话

有的网站当你一打开的时候就会给你分配一个会话ID,以跟踪你接下来的一系列操作。把它们有效的关联起来,在页面与页面之间共享一些数据。(也许不共享数据),当你关闭浏览器的时候,此会话结束。或者你长时间未操作,此会话已过期,服务器已把会话状态清除,那么此会话也算结束。不登录的情况下谈论会话其实没有什么意义。

2.登录情况下的会话

因为登录了,所以有用户信息,在页面之间要共享用户数据的。所以这时,从你登录到退出,或者没有退出到直接关闭浏览器,这算一个完整的会话。其实理论上说,如果没有退出,在不长的时间间隔后再次打开同一个网站,上次的会话没有过期的话,这也应该算是同一次会话。

php管理会话的流程:

1.开启会话

session_start();

此函数的调用会产生一个session文件,保存在服务器。并且把session id 以cookie的形式发送给客户端。以保证在后续的操作中使用同一个session文件。

php会按照session文件名产生规则产生一个文件名,并保存在指定的路径。这些行为受相关的session配置影响。

为了能清晰的描述此过程,我们先把产生的文件名以及发送的cookie拿过来

服务器向浏览器发送的cookie可能类似这样:

Set-Cookie:PHPSESSID=38ledu4nldfsagbfbl4mgv1101; path=/

而服务器上产生的session文件可能类似这样:

sess_38ledu4nldfsagbfbl4mgv1101

本文所提及的session相关配置都可以在php.ini中找到,而且可以修改它。

session.name  默认为 PHPSESSID 大家已经看到了这个配置的值会作为cookie键值对中的键发送到浏览器,值就是session id当调用session_start()的时候,PHP 内部会调用会话管理器的 open 和 read 回调函数,会话管理器可以是php的默认会话管理器,可以是扩展提供的其他管理器,也可能是用户自定义的,此处以php默认会话管理器为例。

php默认的会话管理器的open函数受session.save_handler = files配置的影响,此处理解为以读写文件的方式保存数据。文件名默认是sess_前缀加SessionHandler::create_sid生成的session id ,SessionHandler::read 函数会从session文件中读取数据,并反序列化存放到$_SESSION超全局数组中,当开启一个新的会话时,当然是读不出数据的,重用一个已存在的会话,则会读出数据,这样就可以利用$_SESSION在页面间通信了。当脚本执行完毕的时候会调用会话管理器的write函数将此脚本中的一些$_SESSION改变,写入session文件。

2.设置会话数据

由于php在session和cookie方面做的比较智能化。我们要设置session数据时只需向$_SESSION数组添加对应的键值对,当脚本执行完毕自然就会把数据保存到session文件。

3.使用会话数据

上面已经提到php在cookie方面做的比较智能。当有session.name对应的cookie随访问发送到服务器时。php会自动找到对应的session文件,并将其数据存放在$_SESSION数组中。

4.销毁会话数据

session_destroy 可以销毁服务器端的会话数据。但是如果用户主动退出的话,更安全的做法是把cookie也删除。否则cookie中的session id容易泄露,当你登录的情况下,别人用同样的session id访问网站,就会得到跟你一样的用户信息了。