咨询电话:
15628812133
03
2018/08

PHP 项目实战开发中,Session的原理及最佳实践

发布时间:2018-08-03 18:21:04
发布者:pengyifeng
浏览量:
0

Session 的原理

session是在服务器端存储数据的一种方法,对应的cookie是在客户端保持用户数据。为了在客户端(比如浏览器)可以跨页面交流数据,Netscape将cookie引入浏览器。所以,cookie是保存在浏览器端的。

服务器是如何来找到对应的sessionne呢,是使用全局变量$_COOKIE。所以说,服务器在接到(request)的时候通过这个$_COOKIE获取客户端的数据,然后又$_COOKIE来跟客户端交流,将数据传到客服端;相对于客户端来说,通过$_COOKIE将想要存储的数据发送给客户端存储,需要取出数据的时候,通过这个session来向服务器取数据,很方便的使用方法,但是cookie是有时效的所以说session也是有时效的。

那么客户端如何记录这么多的数据呢?首先就是需要浏览器跟服务器建立数据传输关系,使得每个客户端都要一个唯一标示,这样,服务器才能识别出来。建立唯一标识的方法是通过cookie或者通过GET方式在服务端建立session。php在使用session的时候,默认的会建立一个名叫"PHPSESSID"的cookie,值是唯一的,并在某个目录下保存一个文件(文件名唯一由刚刚生成的那个cookie决定),然后发送给客户端,客户端在再次发送请求的时候,就会把这个名叫"PHPSESSID"的cookie带过来,也就是$_COOKIE["PHPSESSID"],这个cookie的值不是session本身,而是一个session_id,一个和客户端一一对应的id。

需要注意的是:

  • PHPSESSID这个名称是可以配置的

  • ession保存的位置也是可以配置的通过php.ini中session.save_path设置,甚至,可以通过别的方式保存在数据库或者缓存中

  • 在存session时限序列化,读取的时候,先反序列化

这就是session的实现机制和原理。在机制不变的情况下,每个环节的实现方式几乎都可以自定义。比如可以在这些方面实现自定义:

  • 如果客户端不支持cookie,你也可以通过GET方式将session id发送到服务端

  • 如果你想改变唯一session_id的生成方式,你也可以选择用uniqid

  • 你也可以改变session存放的路径

  • 可以改变session文件的前缀,后缀

  • 甚至你可以把session存在数据库,缓存当中

要想将session保存在别的媒介(比如缓存)需要先介绍一个接口:SessionHandlerInterface
可以通过实现这个接口,来自定义session的存贮方式,比如数据库。当然,要实现一些基本的方法。

session简介.jpg

Session的过期问题

ini_set('session.gc_maxlifetime', 3600); //设置时间 ini_get('session.gc_maxlifetime');//得到ini中设定值

超过这个gc_maxlifetime时间,session会被认为是garbage,有垃圾就有垃圾回收,但是垃圾回收的检查却不是每次都进行,而是按照一个几率,分别是这两个参数:

session.gc_probability = 1
session.gc_divisor = 1000

客户端方面

主要和cookie的过期时间有关。php.ini中通过session.name = PHPSESSID来保存session的cookie名字默认为PHPSESSID(可以修改),那么可以设定这个cookie的过期时间来实现session的过期。

session.use_cookies = 1;

把这个的值设置为1,利用cookie来传递sessionid;

session.cookie_lifetime = 0

这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭sessionid就作废。如果想使得PHPSESSID cookie永久有效,这个可以设为一个很大的值如999999999。另外也可以通过session_set_cookie_params()函数来设定PHPSESSID cookie的有效期


关键词:
返回列表