首页 PHP 正文
361

php设置session有效时间

  • yiqingpeng
  • 2015-04-24
  • 0
  •  
session的默认持续时间是24分钟,而且浏览器关闭之后也会销毁。通过以下方法,可以自行设置session的有效时间。
打开php.ini文件,
session.use_cookies 设置为1, 表示利用cookie传递session id
session.cookie_lifetime 这个是指保存session的cookie的有效时间,默认是0表示浏览器关闭就失效。那么我们可以设置一个很大的数字,比如10000000;
session.gc_maxlifetime 这个表示session在服务器端有效的时间,我们设置成上面那个大数10000000

通常来说,修改上面配置就ok了。但是有些情况下这种设置也会有不成功的时候,我们知道,每一个请求发生时,PHP都会计算一个GC启动机率,即session.gc_probability/session.gc_divisor,根据这个机率,GC会扫描session所在的目录,没有特殊配置session.save_path变量时,session都是统一保存在系统临时目录,GC会在临时目录中扫描每一个session文件,用session最后修改时间来跟gc_maxlifetime进行比较,并把过期的session文件全部清除。

如果有一个应用设置的gc_maxlifetime是10分钟,那么由这个应用启动的GC,会把所有超过10分钟的session文件删除,即使不是此应用生成的session也不能幸免。这是一个问题。

还有一个问题就是,在php.ini设置session有效时间是全局有效的,也就是服务器所有网站应用都会受其影响。

为了解决以上两个问题,我们可以在脚本运行时设置session.gc_maxliftime、session.cookie_lifetime 和 session.save_path:
ini_set('session.cookie_lifetime', 24*3600);
ini_set('session.gc_maxlifetime', 24*3600);
//在临时目录下建立一个子目录供当前脚本保存session
$session_path = rtrim(sys_get_temp_dir(), '/').'/sess';
if(!is_dir($session_path)){
    mkdir($session_path);
}
ini_set('session.save_path', $session_path);
以上代码可以解决我们的问题,但是还有两点要注意的:
第一、所有关于session的变量配置必须在session_start()调用之前进行配置。
第二、GC是感知不到自定义session保存路径的,也就是自定义路径下的session文件并不能被GC扫描到,需要自行写定时程序去清除。



正在加载评论...