session:在计算机中,尤其是在网络应用中,称为“会话”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
cookie : 存在于用户本地的,由服务器端生成的一些数据。
php.ini中相关的几个设置
session.gc_maxlifetime=1440 //设置session在服务器端的有效时长,当超过这个时长后,服务器会调用GC来处理过期session。但是GC的运行概率由session.gc_probability/session.gc_divisor 运算出的结果来决定,按照下边的设置,也就是只有千分之一的概率会执行。
session.gc_probability = 1
session.gc_divisor = 1000
session.use_cookies = 1 //把这个的值设置为1,利用cookie来传递sessionid
session.cookie_lifetime=0 //这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废。
session.name=PHPSESSID //后文中会讲到
那么此时可以说明一下session的原理的。HTTP协议是一个无状态的协议,那么服务器上的session是如何知道你是你,并且为你展示你放在session中的数据呢?首先先举个例子来抛砖引玉,我们去超市买东西,到自动存包处存包时,点击存包按钮,机器会给你打印一个条码小票,然后打开对应编号的箱子让你把包放进去。当你取包时只要用这个条码小票在机器上扫一扫,机器就知道给你开哪个箱子里。
session和cookie正式这个原理。当你访问一个网站时,网站将你的访问数据存入session时,会按照配置文件中的session.name为session生成一个sessionID,它就是你取包时用的条码小票。生成后服务器会把它写入到客户端的cookie中,以后客户端向服务器端发送请求时,在请求头中都会包含此sessionID,服务器端会根据此sessionID找到服务器端存储的session,以此来完成session的上下文操作。
PS:1.如果你的session.cookie_lifetime设置的时间长于session.gc_maxlifetime,那么可能当session过期时,客户端的cookie中仍然持有这个sessionID,当客户端将此加入到请求头中发送给服务器端时,虽然超过了session.gc_maxlifetime,但是因为GC的此时概率是千分之一,还没有把对应的session文件销毁,那么此时还是可以找到用户的session信息的。
2.若session被彻底回收了(服务器上的session文件也被删除了),但cookie中的sessionID仍然存在,那么会使用此sessionID重新创建一个session。