background image

php 设置 session 的生存周期

本文主要分享一下关于

php session 的生存周期的相关知识。

首先说一下

session 的创建的开始到结束的过程。

当程序需要为某个客户端的请求创建一个

 session 的时候,服务器首先会检查这个客户

 

端是否已经包含了一个

session 

 

标识,这个我们称为

session id

 

(获取方法为

session_id() 

 

),如果已包含一个

session id 

 

则说明此客户端之前已经创建过

session,服务器则按照

 

session id 

 

把这个

session 

 

中的值检索出来,如果客户端不包含

session id,说明此客户端第

 

一次请求服务器或手动清除过缓存文件,则为此客户端创建一个

session 并且生成一个与此

 

session 

 

相关联的

session id,一般来说,session id 的值是不会重复的,并且加密的字符串,

 

这个

session id 将被在本次响应中返回给客户端保存。

session 

 

在何时被创建 ?

通常(是指通常)是在浏览器向服务器端第一次请求时被创建,并且它会占用一定的

内存空间,因此在不必要的情况下,尽最关闭

 session 。

session 

 

何时被删除 ?

通常情况下,

session 在会在这几种情况下被删除:

一是使用

 session_destroy() 重置函数手动删除;

二是

 session 

 

的上次活动时间距离当前时间的间隔超过了

session 的超时设置的时间;

三是服务器进程被停止。

怎么在浏览器关闭时删除

 session ?

理论上来说,是做不到这一点,

http 是一种无状态协议,因此服务器不知道客户端什

么时候关掉的浏览器,并且

PHP 也没有一个关相的函数来获取此项信息,但这个问题还可

 

 

 

以得到解决,就是使用 网页特效 代码

window.oncolose 来监视浏览器的关闭动作,然后用

Ajax

 

向服务器端发送一个请求来删除

session ,但这个办法也并不会完全解决问题,原因

是在有些情况下比如浏览器崩溃、突然断电、用户死机等这些时候并不能作出反应。

如何设置使

session 在一段时间过后自动失效(删除)?

session_start()是 session 机制的开始,它有一定概率开启垃圾回收,因为 session 是存放

在文件中,

PHP 自身的垃圾回收是无效的,SESSION 的回收(删除)是要删文件的,这个

概率是根据

php.ini

 

的配置决定的,但是有的系统是

session.gc_probability = 0,这也就是说

概率是

0,而是通过 cron 脚本来实现垃圾回收(即删除 session)。

PHP 中的 session 有效期默认是 1440 秒(24 分钟,注:php5 里默认的是 180 分】,也就

是说,客户端超过

24 分钟没有刷新,当前 session 就会失效。很明显,这是不能满足需要的。

一个已知管用的方法是,使用

session_set_save_handler,接管所有的 session 管理工作,

一般是把

session 信息存储到数据库,这样可以通过 SQL 语句来删除所有过期的 session,

精确地控制

session 的有效期。这也是基于 PHP 的大型网站常用的方法。但是,一般的小型网

站,似乎没有必要这么劳师动众。

但是一般的

Session 的生命期有限,如果用户关闭了浏览器,就不能保存 Session 的变

量了!那么怎么样可以实现

Session 的永久生命期呢?

大家知道,

Session 储存在服务器端,根据客户端提供的 SessionID 来得到这个用户的

文件,然后读取文件,取得变量的值,

SessionID 可以使用客户端的 Cookie 或者 Http1.1 协

议的

Query_String(就是访问的 URL 的“?”后面的部分)来传送给服务器,然后服务器读取

Session 的目录。

要实现

Session 的永久生命期,首先需要了解一下 php.ini 关于 Session 的相关设置(打

php.ini 文件,在“[Session]”部分):