PHP-会话控制-Session
1.什么是Session
上一节我们讨论到将数据以cookie的形式保存在客户端有很多弊端。为了解决这些问题就有了Session。
Session是以文件的形式保存在服务器端的数据。
服务器通过向客户端发送一个Cookie保存sessionid的方式,将session与客户端建立一对一的联系。
浏览器:Cookie(sessionid)<------一一对应------>(sessionid)Session:服务器
2.开启一个会话
session_start(); /*开启一个会话主要做一下两件事*/ /*1如果客户端有以cookie保存的sessionid,那么就将对应的session数据取到内存中*/ /*2如果没有,发送一个新的sessionid以cookie的形式交给客户端保存*/
注:如果是基于Cookie的Session因为Cookie是在http头中传递的,所以session_star()和setcookie()一样在这之前不能有任何输出。
如图,运行一遍session_start()之后在浏览器找到了一个名为PHPSESSID的Cookie
我们使用下面代码打印出客户端的sessionid
session_start(); echo session_id();//ldlq3n79jhkbdt120iacq19vs6
两者的id是一致的。如果在不关闭浏览器的前提下(因为默认的是浏览器关闭时删除PHPSESSID),打开一个新的网页仍然会打印出一样的sessionid。
如果想要更改保存sessionid的cookie保存的时间可以在配置文件中修改session.cookie_lifetime选项(以秒为单位),默认是0,表示浏览器关闭时删除。
3.Session存取数据
PHP使用一个全局数组$_SESSION存取数据,使用起来就和普通数组一样。
值得一提的是,内存中的数据在脚本执行完毕后就会全部销毁,所以session中的数据实际上都是要以文件的形式存到硬盘中的。而开启会话时又会把保存的数据读到内存中方便使用。
这些操作都是有PHP自动处理的。
如下,创建一个session数据
session_start(); echo session_id(); $_SESSION['test']="this is a session";
当代码执行完毕后会创建一个文件保存这个数据,文件名为session的sessionid。
这个目录是通过配置文件中的session.save_path配置的,一般是'./tmp'。
我的目录是"E:xampp/tmp",打开目录找到文件
打开文件看一下
这正是之前保存的值。
4.结束一个Session
/*第一步,开启会话,如果不开启会话PHP获得sessionid的话PHP怎么知道删除那个session呢*/ session_start(); /*第二步,session中的数据已经被读到内存中了,所以要清空它*/ /*注意不能用unset($_SESSION),因为我们只是想清空数据,而不是删除这个全局数组*/ $_SESSION=array(); /*第三步,删除客户端的cookie*/ /*注:默认的cookie名为PHPSESSID但是这个名字是可以在配置文件中通过session.name更改的*/ /*所以比起使用PHPSESSID还是用session_name()函数获得cookie名稳妥一些*/ if(isset($_COOKIE[session_name()])) { setcookie(session_name(),'',time()-1,'/'); } /*第四步,删除服务器端的文件*/ session_destroy();
5.垃圾清理机制
假如浏览器端的cookie生命周期到了被删除以后,那么我们就没有办法用上面的方法删除保存在硬盘中的session文件了。客户端下次访问是会被分配到一个新的Sessionid,原来的文件也用不到了。
那么这些垃圾文件怎么删除呢。
PHP有垃圾清理机制。
在配置文件中有三个重要选项
session.gc_maxlifetime= 指定一个时间,以秒为单位,当垃圾清理机制启动是如果session文件的修改时间大于这个属性设置的值的话,垃圾清理机制就会删除这个文件,反之不然。
session.gc_probability和session.gc_divisor,设S=session.gc_probability/session.gc_divisor,那么每次session_start()时有S的几率启动垃圾清理机制。
S的值过大过小都不好,一般session.gc_probability=1,而session.gc_divisor=(1000~5000)。