最近工作之余有时间学习了一下php的session默认机制,下面是一些基本的关于session机制的关键要点罗列。
一.session是php的扩展,在php.ini配置文件中是默认开启的。
二.session基本工作机制
session,从字面意思来说是会话管理,即客户端跟服务器的会话管理。使用会话管理,需要使用session_start方法开启session,一旦调用这个方法,服务器会先自动获取配置中的session_id的名称,并根据客户端发送过来的cookie,检查客户端是否有session_id值发送过来,如果有,就会去服务器相应存储session文件的目录去查找对于session_id指定的文件,并将相关数据反序列化放入$_SESSION中,如果没有,就会针对这个客户端分配session_id。这个会话id具有唯一性,它的作用就是保证客户端的会话信息在服务器能够一一对应,具体来说,它会返回客户端一个cookie信息,其中包含session_id,这个cookie的键名、过期时间等是在php.ini中配置的,在服务器端,它会根据这个id以及php.ini配置的session存放路径,以id为文件名存放,之后对于这个id的session会话数据将存储在这个文件中,直到销毁。
三.为$_SESSION赋值
比如新添加一个值$_SESSION[‘test’] =’blah’; 那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,用把$_SESSION的值写入到session_id指定的文件夹中,然后关闭相关资源.这个阶段有可能执行更改session_id的操作,比如销毁一个旧的的session_id,生成一个全新的session_id.一半用在自定义 session操作,角色的转换上, 比如Drupal.Drupal的匿名用户有一个SESSION的,当它登录后需要换用新的session_id。
四.写入SESSION操作
在脚本结束的时候会执行SESSION写入操作,把$_SESSION中值写入到session_id命名的文件中,可能已经存在,可能需要创建新的文件。
五.销毁SESSION
SESSION发出去的COOKIE一般属于即时COOKIE,保存在内存中,当浏览器关闭后,才会过期,假如需要人为强制过期,比如 退出登录,而不是关闭浏览器,那么就需要在代码里销毁SESSION,方法有很多:
- setcookie(session_name(),session_id(),time() -8000000,..);//退出登录前执行
- usset($_SESSION);//这会删除所有的$_SESSION数据,刷新后,有COOKIE传过来,但是没有数据。
- session_destroy();//这个作用更彻底,删除$_SESSION 删除session文件,和session_id
当不关闭浏览器的情况下,再次刷新,2和3都会有COOKIE传过来,但是找不到数据.