session设置过期的方法(转载)

这篇文章主要介绍了php中实现精确设置session过期时间的方法,需要的朋友可以参考下

大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下session过期时间。

对此,可以在PHP中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默认24分钟)
这里你可以随便设置一下过期时间.但是有人说设置以后,好象不起作用!
其实不是不起作用,而是因为系统默认:

?


1

2

session.gc_probability = 1

session.gc_divisor = 1000

garbage collection 有个概率的,1/1000就是session 1000次才有一次被回收。
只要你的访问量大了,那就能达到回收的效果.
或者你也可以设置一下session.gc_divisor 的值,
比如:session.gc_divisor = 1,这样就能明显的看到SESSION过期的效果了.

我们最常用的是在php程序中设置,如下例程序所示:

?


1

2

3

4

<?php

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

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

?>

这样就搞定了,如果要设置已过期的话也可以在程序中实现:

?


1

2

3

<?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

?


1

2

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:

?


1

cd /path/to/sessions; find -cmin +24 | xargs rm

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()这
个函数,具体做法如下:

?


1

2

3

4

5

6

7

8

9

<?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

?


1

2

3

4

5

6

7

8

9

10

<?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>";

?>

文件2: test2.php

?


1

2

3

4

5

6

7

8

<?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保存的地址:

?


1

session.save_path: var/tmp

所以就是检查下var/tmp文件夹是否可写。
写一个文件:test3.php来测试一下:

?


1

2

3

<?php

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

?>

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

?


1

2

3

4

5

6

7

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

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

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

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

{

session_save_path($sessSavePath);

}

时间: 2024-10-06 01:27:11

session设置过期的方法(转载)的相关文章

asp中设置session过期时间方法总结

http://www.jb51.net/article/31217.htm asp中设置session过期时间方法总结 作者: 字体:[增加 减小] 类型:转载 asp中默认session过期时间为20分钟,很多情况下不够,今天有客户要求很多就要重新登录了,所以准备了这篇文章,方便需要的朋友 如果程序中没有设置session的过期时间,那么session过期时间就会按照IIS设置的过期时间来执行,IIS中session默认过期时间为20分钟,IIS中session时间可以更改 时间设置要放在前面

关于session的过期时间的方法

session的的过期时间的设置,通用的三种方法: 1.  直接在后台代码中设计,使用session.setMaxInactiveInterval(60*60); 注意这个时间的单位是秒,60*60就是一小时. 如果将时间设置为负数,则表示用不过期. 2.在项目的web.xml文件中添加配置过期时间的代码即可. <session-config> <session-timeout>400</session-timeout> </session-config>

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_maxl

thinkphp3.2设置session的过期时间

thinkPHP3.2中session的过期时间配置是不能使用的,我们需要修改一下它的配置文件thinkPHP>common>functions.php,找到这一行: if(isset($name['expire'])) ini_set('session.gc_maxlifetime', $name['expire']); 改成: if(isset($name['expire'])) ini_set('session.gc_maxlifetime', $name['expire']);ini_

Thinkphp框架下设置session的过期时间

打开项目中的配置文件,添加session的过期配置,如下: 'SESSION_OPTIONS' => array( 'name' => 'BJYSESSION', //设置session名 'expire' => 3600, //SESSION过期时间,单位秒 'use_trans_sid' => 1, //跨页传递 'use_only_cookies' => 0, //是否只开启基于cookies的session的会话方式 ),

session存储的替代方法redis

php默认使用文件存储session,如果并发量大,效率非常低.而redis对高并发的支持非常好,所以,可以使用redis替代文件存储session. 这里,介绍下php的session_set_save_handler 函数的作用和使用方法.该函数定义用户级session保存函数(如打开.关闭.写入等).原型如下: bool session_set_save_hanler(callback open,callback close,callback read,callback write,cal

如何使Session永不过期

转载:http://blog.csdn.net/wygyhm/article/details/2819128 先说明情况:公司做监控系统,B/S结构,主要用在局域网内部!监控系统开机可能要开好长时间,管理员的ID 和权限等是写在Session里的——我想不用Cookies的原因可能是Cookies不是很安全,还有就是局域网内,只是几台机子访问服务器, Session没有几个,所以即使总保持着Session也不会太占用资源,最起码服务器能承受的起. 保持Session的方法:有人说设session

Cookie/Session机制详解(转载)

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个

抽屉之Tornado实战(6)--session工厂(工厂方法模式)

我之前写的session一般保存在服务器的内存里,那可以保存在缓存,或是数据库,那问题来了,不同地方,保存方式是不同的,所以需要定义不同的类,cache/redis/memcached类 session.py import config from hashlib import sha1 import os import time create_session_id = lambda: sha1(bytes('%s%s' % (os.urandom(16), time.time()), encod