php中实现精确设置session过期时间的方法
2016-03-21 11:16
1031 查看
php中实现精确设置session过期时间的方法
多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下session过期时间。对此,可以在PHP中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默认24分钟)这里你可以随便设置一下过期时间.但是有人说设置以后,好象不起作用!
其实不是不起作用,而是因为系统默认:
?
12 | session.gc_probability = 1 session.gc_divisor = 1000 |
只要你的访问量大了,那就能达到回收的效果.
或者你也可以设置一下session.gc_divisor 的值,
比如:session.gc_divisor = 1,这样就能明显的看到SESSION过期的效果了.我们最常用的是在php程序中设置,如下例程序所示:?
1234 | <?php if (!isset( $_SESSION [ 'last_access' ])||(time()- $_SESSION [ 'last_access' ])>60) $_SESSION [ 'last_access' ] = time(); ?> |
123 | <?php unset( $_SESSION [ 'last_access' ]); // 或 $_SESSION['last_access']=''; ?> |
因此,修改php.ini文件中的gc_maxlifetime变量就可以延长session的过期时间了:(例如,我们把过期时间修改为86400秒)
session.gc_maxlifetime = 86400
然后,重启你的web服务(一般是apache)就可以了。session“回收”何时发生:默认情况下,每一次php请求,就会有1/100的概率发生回收,所以可能简单的理解为“每100次php请求就有一次回收发生”。这个概率是通过以下参数控制的
#概率是gc_probability/gc_divisor?
12 | session.gc_probability = 1 session.gc_divisor = 100 |
?
1 | cd /path/to/sessions ; find -cmin +24 | xargs rm |
123456789 | <?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部分,看到session.use_trans_sid参数被设为了零。
这个参数指定了是否启用透明SID支持,即session是否随着URL传递。我个人的理解是,一旦这个参数被设为0,那么每个URL都会启一个session。这样后面页面就无法追踪得到前面一个页面的session,也就是我们所说的无法传递。两个页面在服务器端生成了两个session文件,且无关联。(此处精确原理有待确认)
所以一个办法是在配置文件php.ini里把session.use_trans_sid的值改成1。当然我们知道,不是谁都有权限去改php的配置的,那么还有什么间接的解决办法呢?
下面就用两个实例来说明:
文件1 test1.php
?
12345678910 | <?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>" ; ?> |
?
12345678 | <?php 表明是使用用户ID为标识的session session_id(SID); //启动session session_start(); //输出test1.php中传递的session。 echo "This is " . $_SESSION [ 'name' ]; ?> |
不过有朋友会反映说,这样一来,多个用户的session写在一个SID里了,那Session的价值就发挥不出来了。所以还有一招来解决此问题,不用加session_id(SID);前提是你对服务器的php.ini有配置的权限:
output_buffering改成ON,道理就不表了。
第二个可能的原因是对服务器保存session的文件夹没有读取的权限,还是回到phpinfo.php中,查看session保存的地址:
?
1 | session.save_path: var /tmp |
写一个文件:test3.php来测试一下:
?
123 | <?php echo var_dump( is_writeable ( ini_get ( "session.save_path" ))); ?> |
1234567 | //设置当前目录下session子文件夹为session保存路径。 $sessSavePath = dirname( __FILE__ ). '/session/' ; //如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。 if ( is_writeable ( $sessSavePath ) && is_readable ( $sessSavePath )) { session_save_path( $sessSavePath ); } |
相关文章推荐
- thinkphp去掉index.php访问后缀
- PHP中file_exists与is_file,is_dir的区别
- PHP不用数据库怎么弄图片分页
- 淘宝IP地址库API接口 (PHP)通过ip获取地址信息
- 用PHP对文件夹进行访问权限设置(文件防止被下载设置)
- 图片处理神器ImageMagick以及PHP的imagick扩展
- php的$_FILES的临时储存文件与回收机制
- PHP 获取指定URl页面中所有链接
- Notice: Undefined offset: 1 in D:\\wwwroot\\wr\\askseo\\404.php on line 5
- php单引号中字符串的转义(\"\\\")
- PHP 限制国内IP访问 代码实例
- 解析PHP默认的session id生成算法
- 【转载】PHP5 session 详解【经典】
- PHP中file_exists函数不支持中文名的解决方法
- 修改phpMyAdmin导入SQL文件的大小限制
- php变量覆盖漏洞
- PHP 能和 ACCESS 连接吗???
- dede v57跳转网址直接链接而非直接中转的PHP文件
- laravel遇到"openssl extension is required..."
- PHP next()移动数组内部指针到下一个元素的位置,并返回该元素 prev()