详解PHP SESSION 的TIMEOUT(过期)和总结  




       





 






ASP中 Session.Timeout = 60,意思是60分钟后所有Session变量全部清空。那么PHP有没有相同的设定呢,回答很肯定:“没有!”

PHPSESSION机制有别于ASP,ASP的Session是在内存中开辟一块地方储存这个临时数据,而PHPSESSION是在指定的目录下以文件形式保存数据。甚至在遥远的PHP3,4年代,要在PHP中实现SESSION还得求助于第三方的php函数库,PHP5已经自带。

ASP的SESSION特性: 关闭浏览器OVER && 时间到OVER
PHPSESSION特性: 关闭浏览器OVER || 时间到OVER (两选一)

OK,简而言之PHPSESSION原理:

PHP在tmp目录下(PHP.ini默认设置)创建一个“SESS”+随机码的无后缀名文件,来保存$_SESSION[]定义的数据。然后给这个文件匹配一个新的cookie,cookie name是“PHPSESSID”(PHP.ini默认设置),cookie value是对应这个文件的session.id,这个cookie每当关闭浏览器后就会过期(PHP.ini默认设置),和其匹配的$_SESSION[]也就跟着一起失效。你甚至可以把PHP的SESSION理解为一个存在特殊目录下的特殊COOKIE。区别是它的文件取名交复杂,正常人是猜不到的,而且保存在服务器上,所以比cookie更安全。

下面介绍PHP SESSION相关的函数和PHP.ini设定:

如果要让PHPsession活的更长久,就要和它匹配的cookie更长久。

$lifetime = 3600; //单位秒,3600秒=1小时

session_set_cookie_params($lifetime);

session_start(); //注意一定要在session_start()之前

或者在php.ini中找到如下,默认是0,即关闭浏览器就失效

session.cookie_lifetime = 3600

效果是完全一样的。这样就算关闭浏览器,1小时内再次打开,session一样存在(就是cookie嘛)。

你可以更改session的保存目录,函数如下:

$sessionpath = './mysession/';

session_save_path($sessionpath);

session_start();

或者更改php.ini如下

session.save_path = "/mysession"

你可以通过函数得到当前的session.id 或者 自己定义session.id

session_id("vip123");

session_name("bluesdog");

session_start();

echo session.name()."=".session.id();

所以下面这句话和上面的session_set_cookie_params一样定义了session的存活时间

 setcookie(session_name(),session_id(),time()+3600,"/"); 

下面列举一些搞人的session设定

PHP.ini中如下行

session.cache_limiter = nocache;

session.cache_expire = 180

乍一看像是session的存活周期设定,expire等于180分钟嘛,其实这个和$_SESSION[]变量毫不搭界,它是页面缓存的。

什么是缓存?

它是属于浏览器的特性,它决定你浏览网页的缓存方式,没有缓存的情况会使你按浏览的“后退”键时提示要你更新连接,之前的内容就没有了,比如你填入的表单信息,都被丢失。
session_cache_limiter内的几个参数意义是:
nocache:当然是不缓存(比如:表单信息被清除),但公共变量可以缓存
private:私有方式缓存(比如:表单信息被保留,但在生存期内有效)
private_no_cache:私有方式但不过期(表单信息被保留)
publice:公有方式,(表单信息也被保留)

也可以通过php函数设定

session_cache_limiter('private');

session_cache_expire(1);

session_start(); //注意任何session的设定必须在session_start()之前

PHP.ini中又发现如下行

session.gc_probability = 1

session.gc_divisor     = 100

session.gc_maxlifetime = 1440

乍一看这里怎么又有一个lifetime??其实这里的lifetime和$_SESSION[]变量也毫不搭界,它是回收垃圾用的。

什么是回收垃圾?

垃圾回收(Garbage Collection)时间,每个用户登录都会生成session文件,如果用户中途关闭IE,那么服务器就会生成一个垃圾文件。gc_maxlifetime就是用来定时删除一些过期的垃圾文件的。

上面3句话的意思就是当 100 次链接中会有 1 次在 1440 秒后做清除垃圾文件的工作。如果你把gc_divisor设为 1 ,那么每次连接都会清除垃圾,但听说服务器压力会挺大,不建议。另外经过别人测试,在统一了 session.cookie_lifetime 和 session.gc_maxlifetime 后, session的定期清除效果才会比较好。

session_destroy(); //这个不用说了,地球人都知道

那我一定要PHPsession和ASP的session一样拥有两个特性呢(关闭IE失效 && 时间到失效)?

  1. 将 Timestamp 放入 $_SESSION 中,每次 request 的时候对其值和现在值 now() 进行比较。如果时间间隔没有超出 Time Out 的期限,那么就将现在的时间 now() 赋值给 $_SESSION 中的纪录 timestamp 的部分。
  2. 将 timestamp 放入数据库中,每次 request 的时候对其值和现在值 now() 进行比较。如果时间间隔没有超出 Time Out 的期限,那么就将该用户的 session 纪录进行更新。

OK 这样就行了。