自定义session过期时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义session过期时间相关的知识,希望对你有一定的参考价值。

自定义session过期时间

参考:http://www.jb51.net/article/52309.htm


php中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默认24分钟).

这里你可以随便设置一下过期时间.但是有人说设置以后,好象不起作用!

其实不是不起作用,而是因为系统默认:

session.gc_probability = 1

session.gc_divisor = 1000

garbage collection 有个概率的,1/1000就是session 1000次才有一次被回收。

只要你的访问量大了,那就能达到回收的效果.

或者你也可以设置一下session.gc_divisor 的值,

比如:session.gc_divisor = 1,这样就能明显的看到SESSION过期的效果了.


在php程序中设置,如下例程序所示:

<?php

if(!isset($_SESSION[‘last_access‘])||(time()-$_SESSION[‘last_access‘])>60)

$_SESSION[‘last_access‘] = time();

?>

如果要设置已过期的话也可以在程序中实现:

<?php

unset($_SESSION[‘last_access‘]);// 或 $_SESSION[‘last_access‘]=‘‘;

?>


session有过期的机制:

session.gc_maxlifetime 原来session 过期是一个小概率的事件,分别使用session.gc_probability和session.gc_divisor 来确定运行session 中gc 的概率 session.gc_probability和session.gc_divisor的默认值分别为 1和100。分别为分子和分母 所以session中gc


的概率运行机会为1% 。如果修改这两个值,则会降低php的效率。所以这种方法是不对的!!

因此,修改php.ini文件中的gc_maxlifetime变量就可以延长session的过期时间了:(例如,我们把过期时间修改为86400秒)

session.gc_maxlifetime = 86400

然后,重启你的web服务(一般是apache)就可以了。

session“回收”何时发生:

默认情况下,每一次php请求,就会有1/100的概率发生回收,所以可能简单的理解为“每100次php请求就有一次回收发生”。这个概率是通过以下参数控制的

#概率是gc_probability/gc_divisor

session.gc_probability = 1

session.gc_divisor = 100

注意1:假设这种情况gc_maxlifetime=120,如果某个session文件最后修改时间是120秒之前,那么在下一次回收(1/100的概率)发生前,这个session仍然是有效的。

注意2:如果你的session使用session.save_path中使用别的地方保存session,session回收机制有可能不会自动处理过期session文件。这时需要定时手动(或者crontab)的删除过期的session:


PHP中的session永不过期

不修改程序是最好的方法了,因为如果修改程序,测试部一定非常郁闷,那么只能修改系统环境配置,其实很 简单,打开php.ini设置文件,修改三行如下:

1、session.use_cookies

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

2、session.cookie_lifetime

这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以PHP的 session不能永久使用! 那么我们把它设置为一个我们认为很大的数字吧,999999999怎么样,可以的!就这样。

3、session.gc_maxlifetime

这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除! 那么我们也把它设置为99999999。

就这样一切ok了,当然你不相信的话就测试一下看看——设置一个session值过个10天半个月的回来看看,如果你的电脑没有断电或者宕机,你仍然可以看见这个sessionid。

当然也可能你没有控制服务器的权限并不能像我一样幸运的可以修改php.ini设置,一切依靠我们自己也是有办法的,当然就必须利用到客户端存储 cookie了,把得到的sessionID存储到客户端的cookie里面,设置这个cookie的值,然后把这个值传递给session_id()这 


个函数,具体做法如下:

<?php

session_start(); // 启动Session 

$_SESSION[‘count‘]; // 注册Session变量Count 

isset($PHPSESSID)?session_id($PHPSESSID):$PHPSESSID = session_id(); 

// 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID 

$_SESSION[‘count‘]++; // 变量count加1 

setcookie(‘PHPSESSID‘, $PHPSESSID, time()+3156000); // 储存SessionID到Cookie中 

echo $count; // 显示Session变量count的值 

?>


session失效不传递

我们先写个php文件:<?=phpinfo()?>, 传到服务器去看看服务器的参数配置。

转到session部分,看到session.use_trans_sid参数被设为了零。

这个参数指定了是否启用透明SID支持,即session是否随着URL传递。我个人的理解是,一旦这个参数被设为0,那么每个URL都会启一个session。这样后面页面就无法追踪得到前面一个页面的session,也就是我们所说的无法传递。两个页面在服务器端生成了两个


session文件,且无关联。(此处精确原理有待确认)

所以一个办法是在配置文件php.ini里把session.use_trans_sid的值改成1。

当然我们知道,不是谁都有权限去改php的配置的,那么还有什么间接的解决办法呢?

下面就用两个实例来说明:

文件1 test1.php

<?php

//表明是使用用户ID为标识的session

session_id(SID);

//启动session

session_start();

//将session的name赋值为Havi

$_SESSION[‘name‘]="Havi";

//输出session,并设置超链接到第二页test2.php

echo "<a href="test2.php" rel="external nofollow" >".$_SESSION[‘name‘]."</a>";

?>

test2.php

<?php

表明是使用用户ID为标识的session

session_id(SID);

//启动session

session_start();

//输出test1.php中传递的session。

echo "This is ".$_SESSION[‘name‘];

?>

所以,重点是在session_start();前加上session_id(SID);,这样页面转换时,服务器使用的是用户保存在服务器session文件夹里的session,解决了传递的问题。

不过有朋友会反映说,这样一来,多个用户的session写在一个SID里了,那Session的价值就发挥不出来了。所以还有一招来解决此问题,不用加session_id(SID);前提是你对服务器的php.ini有配置的权限:

output_buffering改成ON,道理就不表了。

第二个可能的原因是对服务器保存session的文件夹没有读取的权限,还是回到phpinfo.php中,查看session保存的地址:

session.save_path: var/tmp

所以就是检查下var/tmp文件夹是否可写。

写一个文件:test3.php来测试一下:

<?php

echo var_dump(is_writeable(ini_get("session.save_path")));

?>

如果返回bool(false),证明文件夹写权限被限制了,那就换个文件夹咯,在你编写的网页里加入:

//设置当前目录下session子文件夹为session保存路径。

$sessSavePath = dirname(__FILE__).‘/session/‘;

//如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。

if(is_writeable($sessSavePath) && is_readable($sessSavePath))

{

session_save_path($sessSavePath);

}


--------------------------------------

参考:

http://www.jb51.net/article/74783.htm


在php中设置session有很多方面包有给session设置值或直接设置过期、失效和有效期,下面小编来给大家给各位朋友介绍怎么使用。

我们先来看看在php.ini中session怎么设置,打开 php.ini,查找Session设置部分中以下一项,代码如下:


session.save_path = "N;/path"

session.save_path = "C:/Temp"  #此处以你自己设定的路径为准

这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,后面的“/path”表示session文件存放的根目录路径,比如我们设置为下面的格式,代码如下:

session.save_path = "2;C:/Temp"

上面的设置表示我们把php的session文件进行两级目录存储,每一级目录分别是0-9和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,共1332个文件夹,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享


session数据,可以把目录级增加到3级或者更多。

Session过期时间设定

继续PHP中的Session话题,在PHP中主要通过设置session.gc_maxlifetime来设定Session的生存周期,例如如下代码:

<?php 

ini_set(‘session.gc_maxlifetime‘, 3600); //设置时间 

ini_get(‘session.gc_maxlifetime‘);//得到ini中设定值 

?> 

下面提供一个别人封装好的函数,但是我没有测试过,仅供参考,代码如下:

<?php 

function start_session($expire = 0) 

 if ($expire == 0) { 

 $expire = ini_get(‘session.gc_maxlifetime‘); 

 } else { 

 ini_set(‘session.gc_maxlifetime‘, $expire); 

 } 

 if (emptyempty($_COOKIE[‘PHPSESSID‘])) { 

 session_set_cookie_params($expire); 

 session_start(); 

 } else { 

 session_start(); 

 setcookie(‘PHPSESSID‘, session_id(), time() + $expire); 

 } 

?> 

使用方法:

加入start_session(600);//600秒以后过期。

session永不过期的方法

打开php.ini设置文件,修改三行如下:

1、session.use_cookies

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

2、session.cookie_lifetime

这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以PHP的session不能永久使用! 那么我们把它设置为一个我们认为很大的数字吧,999999999怎么样,可以的!就这样。

3、session.gc_maxlifetime

这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!那么我们也把它设置为99999999。

就这样一切ok了,当然你不相信的话就测试一下看看——设置一个session值过个10天半个月的回来看看,如果你的电脑没有断电或者宕机,你仍然可以看见这个sessionid。

当然也可能你没有控制服务器的权限并不能像我一样幸运的可以修改php.ini设置,一切依靠我们自己也是有办法的,当然就必须利用到客户端存储cookie了,吧得到的sessionID存储到客户端的cookie里面,设置这个cookie的值,然后把这个值传递给session_id()这个


函数,具体做法如下:

<?php 

session_start(); // 启动Session 

$_SESSION[‘count‘]; // 注册Session变量Count 

isset($PHPSESSID)?session_id($PHPSESSID):$PHPSESSID = session_id(); 

// 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID 

$_SESSION[‘count‘]++; // 变量count加1 

setcookie(‘PHPSESSID‘, $PHPSESSID, time()+3156000); // 储存SessionID到Cookie中 

echo $count; // 显示Session变量count的值 

?> 

以上就是php设置session的具体做法,内容涉及session设置值或直接设置过期、失效和有效期,希望对大家的学习有所帮助。



-------------------------------------

参考:

http://www.jb51.net/article/17882.htm

PHP中的session有效期默认是1440秒(24分钟),也就是说,客户端超过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]”部分): 

1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递; 

2、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”; 

3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用! 

4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除! 

还有很多的设置,不过和本文相关的就是这些了,下面开始讲使用永久Session的原理和步骤。 

前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以…… 

如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤: 

1、把“session.use_cookies”设置为1,打开Cookie储存SessionID,不过默认就是1,一般不用修改; 

2、把“session.cookie_lifetime”改为正无穷(当然没有正无穷的参数,不过999999999和正无穷也没有什么区别); 

3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间; 

在PHP的文档中明确指出,设定session有效期的参数是session.gc_maxlifetime。可以在php.ini文件中,或者通过ini_set()函数来修改这一参数。问题在于,经过多次测试,修改这个参数基本不起作用,session有效期仍然保持24分钟的默认值。 

由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC


(Garbage Collector)。默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。 

GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。 

到此为止,工作一切正常。那为什么会发生gc_maxlifetime无效的情况呢? 

在默认情况下,session信息会以文本文件的形式,被保存在系统的临时文件目录中。在Linux下,这一路径通常为\tmp,在 Windows下通常为C:\Windows\Temp。当服务器上有多个PHP应用时,它们会把自己的session文件都保存在同一个目录中。同样地,这些PHP应用也


会按一定机率启动GC,扫描所有的session文件。 

问题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的 gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删除掉,而不管它们来


自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。 

找到问题所在,解决起来就很简单了。修改session.save_path参数,或者使用session_save_path()函数,把保存session的目录指向一个专用的目录,gc_maxlifetime参数工作正常了。 

严格地来说,这算是PHP的一个bug? 

还有一个问题就是,gc_maxlifetime只能保证session生存的最短时间,并不能够保存在超过这一时间之后session信息立即会得到删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动,那么大量的session在超过gc_maxlifetime以后仍然会有效。解决这个


问题的一个方法是,把session.gc_probability/session.gc_divisor的机率提高,如果提到100%,就会彻底解决这个问题,但显然会对性能造成严重的影响。另一个方法是自己在代码中判断当前session的生存时间,如果超出了 gc_maxlifetime,就清空当前session。 

但是如果你没有服务器的操作权限,那就比较麻烦了,你需要通过PHP程序改写SessionID来实现永久的Session数据保存。查查php.net的函数手册,可以见到有“session_id”这个函数:如果没有设置参数,那么将返回当前的SessionID,如果设置了参数,就会将当前的


SessionID设置为给出的值…… 

只要利用永久性的Cookie加上“session_id”函数,就可以实现永久Session数据保存了! 

但是为了方便,我们需要知道服务器设置的“session.name”,但是一般用户都没有权限查看服务器的php.ini设置,不过PHP提供了一个非常好的函数“phpinfo”,利用这个可以查看几乎所有的PHP信息! 

------------------------------------------------------------------------------------ 

<title>PHP相关信息显示</title> 

<?phpinfo()?> 

------------------------------------------------------------------------------------ 

打开编辑器,输入上面的代码,然后在浏览器中运行这个程序,会见到PHP的相关信息(如图1所示)。其中有一项“session.name”的参数,这个就是我们需要的服务器“session.name”,一般是“PHPSESSID”。 

记下了SessionID的名称后,我们就可以实现永久的Session数据储存了! 

代码如下:

session_start(); 

ini_set(‘session.save_path‘,‘/tmp/‘); 

//6个钟头 

ini_set(‘session.gc_maxlifetime‘,21600); 

//保存一天 

$lifeTime = 24 * 3600; 

setcookie(session_name(), session_id(), time() + $lifeTime, "/"); 


后记: 

其实真正的永久储存是不可能的,因为Cookie的保存时间有限,而服务器的空间也有限……但是对于一些需要保存时间比较长的站点,以上方法就已经足够了! 

把session放入mysql的Example: 

数据库里建表:session ( sesskey varchar32 , expiry int11 , value longtext) 

code: 

代码执行前已经连接数据库了

--

define(‘STORE_SESSIONS‘,‘mysql‘); 


if (STORE_SESSIONS == ‘mysql‘) { 

if (!$SESS_LIFE = get_cfg_var(‘session.gc_maxlifetime‘)) { 

$SESS_LIFE = 1440; 


function _sess_open($save_path, $session_name) { 


// 如果没有连接数据库,可以在此执行mysql_pconnect,mysql_select_db 

return true; 


function _sess_close() { 

return true; 


function _sess_read($key) { 

$value_query = mysql_query("select value from sessions where sesskey = ‘" .addslashes($key) . "‘ and expiry > ‘" . time() . "‘"); 

$value = mysql_fetch_array($value_query); 


if (isset($value[‘value‘])) { 

return $value[‘value‘]; 


return false; 


function _sess_write($key, $val) { 

global $SESS_LIFE; 


$expiry = time() + $SESS_LIFE; 

$value = $val; 


$check_query = mysql_query("select count(*) as total from sessions where sesskey = ‘" . addslashes($key) . "‘"); 

$check = mysql_fetch_array($check_query); 


if ($check[‘total‘] > 0) { 

return mysql_query("update sessions set expiry = ‘" . addslashes($expiry) . "‘, value = ‘" . addslashes($value) . "‘ where sesskey = ‘" . addslashes($key) . "‘"); 

} else { 

return mysql_query("insert into sessions values (‘" . addslashes($key) . "‘, ‘" . addslashes($expiry) . "‘, ‘" . addslashes($value) . "‘)"); 


function _sess_destroy($key) { 

return mysql_query("delete from sessions where sesskey = ‘" . addslashes($key) . "‘"); 


function _sess_gc($maxlifetime) { 

mysql_query("delete from sessions where expiry < ‘" . time() . "‘"); 


return true; 


session_set_save_handler(‘_sess_open‘, ‘_sess_close‘, ‘_sess_read‘, ‘_sess_write‘, ‘_sess_destroy‘, ‘_sess_gc‘); 


danoo_session_name( ‘dtvSid‘ ); 

danoo_session_save_path(SESSION_WRITE_DIRECTORY); 

--

还是有点不明白,open,write那些参数哪里来的。 

修改php.ini配置的两个常用函数: 

get_cfg_var(‘session.gc_maxlifetime‘) : 取得session.gc_maxlifetime的值 

ini_set(‘session.cookie_lifetime‘,‘0‘) : 设置session.cookie_lifetime的值为0。




以上是关于自定义session过期时间的主要内容,如果未能解决你的问题,请参考以下文章

spring-redis-session 自定义 key 和过期时间

java网站中session 有默认的过期时间吗?

SESSION_EXPIRED : session过期 这是啥意思啊怎样解决这个问题啊

如何解决session时间过期

session过期怎么恢复

如何严格设置php中session过期时间