配置session
在php.ini中和session有关的常用配置选项如下:
session.save_path:保存session数据的路径
session.name: 设置session的标识名,用在客户端Cookie里的session标识名。(php.ini里是这样: session.name=PHPSESSID)
seesion.use_cookies: 是否使用Cookie在客户端保存sessionID,1表示允许。
seesion.cookie_lifetime: cookie中的sessionID在客户机上保存的有效期,0表示延续到浏览器关闭时。
session.gc_probability和session.gc_divisor:定义在每次初始化会话时,启动垃圾回收机制的概率,这个收集的概率计算公式:session.gc_probability / session.gc_divisor
session.gc_maxlifetime:超过此参数设定的秒数后,保存的数据将被视为垃圾并由垃圾机制回收。
session.save_handler:设置保存session数据的机制,默认是file,如需要基于数据库或者memcache的话,可以设置为user.
与session操作相关的过程
开始会话
使用 bool session_start(void)开始一个会话,在用此函数开启一个会话之前不能有任何的输出。第一次调用该函数时,会创建一个唯一的sessionID,并自动设置在http头域的cookie中,同时会在服务器端以这个sessionID创建一个xxx_sessionID命名的文件,用于保存这个会话的信息。当同一个用户在访问网址时会在http头域携带这个sessionID,这时session_start()函数不再创建ID,而是拿到客户端带来的sessionID去寻找xxx_sessionID文件,读取里面的内容,以此来达到跟踪用户的目的。
注册会话变量
在php脚本中访问session需要通过$_SESSION数组来完成,$_SESSION数组必须在session_start()开启后才能启用。给$_SESSION数组赋值就是一个注册变量的过程。当给$_SESSION赋值的同时(如:$_SESSION['name']='jack'),也会自动将信息追加到xxx_sessionID文件中。
注销会话变量与销毁session
当使用完一个seesion变量后,可以将其删除;完成一个会话后,也可以将其删除。删除一个session变量可以使用 unset($_SESSION['name']),这样会把指定的session变量删除,同时也把xxx_sessionID文件里的对应信息删除。使用$_SESSION=array()可以删除当前$_SESSION数组的所有变量,对应文件的内容也将全部清除。如果使用unset($_SESSION)的话,后面将不能在使用$_SESSION数组。
如果需要销毁会话可以使用session_destroy()函数,该函数会销毁当前用户的session,并把xxx_sessionID文件删除,但是该函数不会释放之前session注册的变量,也不会删除保存在客户端的sessionID,所以在销毁之前先把sessionID从客户端中清除,可以使用setCookie()函数来完成,可以设置如下:
setCookie(session_name(), "", time()-3600) //设置过期
所以总的来说session的启动到销毁总共需要四个过程:
//开启session
session_start();
//删除所有session变量
$_SESSION=array();
//删除cookie里的sessionID
if(isset($_COOKIE[session_name()])) {
setcookie(session_name(),'',time()-3600)
}
//最后销毁session
session_destroy();
会话自动回收
日常中我们登陆网站时,网站都有会一个退出登陆的操作,如果点击退出登陆,就是一个与服务端销毁session的过程。但是如果直接关闭窗口,或者断电等情况呢,服务端的session怎么销毁?一般我们会在php.ini文件里设置session.cookie_life=0来设定cookie里的sessionID的有效期为关闭窗口。我们还可以给session设置一个有效期,需要在php.ini文件中设置session.gc_maxlifetime选项,不管浏览器是否开启,只要时间过期,自动回收垃圾机制启动后就会把过期的session清除。那么自动回收机制什么时候开启呢?
一般当调用session_start()函数时就会启动垃圾回收机制。但是一个网站是有多个脚本,每个脚本都使用session_start(),而且网站又是有很多用户访问,所以每次调用session_start()就启动垃圾回收机制是不合理的。这时候需要在php.ini里设置session.gc_probability和session.gc_divisor选项,这两个选项是设置了垃圾回收机制的启动概率,比如设置session.gc_probability=1,session.gc_divisor=100,就是session_start()调用100次,垃圾回收机制启动一次。