php 如何设置一个严格控制过期时间的session


Posted in PHP onMay 05, 2017

1.php session 有效期

PHP的session有效期默认是1440秒(24分钟),如果客户端超过24分钟没有刷新,当前session会被回收,失效。

当用户关闭浏览器,会话结束,session也会失效。

可以修改php.inisession.gc_maxlifetime来设置session的生命周期,但并不能保证在超过这一时间后session信息立即会删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动。那么大量的session在超过session.gc_maxlifetime后仍然有效。

2.session.gc_maxlifetime,session.gc_probability,session.gc_divisor说明

session.gc_maxlifetime = 30 表示当session文件在30秒后没有被访问,则视为过期session,等待GC回收。

GC进程调用的概率是通过session.gc_probability/session.gc_divisor计算得来的,而session.gc_divisor默认是1000,

如果session.gc_probability = 1000,那么GC进程在每次执行session_start()时都会调用,执行回收。

把session.gc_probability/session.gc_divisor的机率提高,会有帮助,但会对性能造成严重影响。

3.严格控制session过期方法

1.使用memcache/Redis来保存session,设置过期时间,因为memcache/redis的回收机制不是按机率的,可以确保session过期后失效。

2.只使用php实现,创建一个session类,在session写入时,把过期时间也写入。读取时,根据过期时间判断是否已过期。

<?php
/**
 * Session控制类
 */
class Session{
  /**
   * 设置session
   * @param String $name  session name
   * @param Mixed $data  session data
   * @param Int  $expire 超时时间(秒)
   */
  public static function set($name, $data, $expire=600){
    $session_data = array();
    $session_data['data'] = $data;
    $session_data['expire'] = time()+$expire;
    $_SESSION[$name] = $session_data;
  }
  /**
   * 读取session
   * @param String $name session name
   * @return Mixed
   */
  public static function get($name){
    if(isset($_SESSION[$name])){
      if($_SESSION[$name]['expire']>time()){
        return $_SESSION[$name]['data'];
      }else{
        self::clear($name);
      }
    }
    return false;
  }
  /**
   * 清除session
   * @param String $name session name
   */
  private static function clear($name){
    unset($_SESSION[$name]);
  }
}
?>

demo:

<?php
session_start();
$data = '123456';
session::set('test', $data, 10);
echo session::get('test'); // 未过期,输出
sleep(10);
echo session::get('test'); // 已过期
?>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

PHP 相关文章推荐
一段防盗连的PHP代码
Dec 06 PHP
PHP实现MVC开发得最简单的方法――模型
Apr 10 PHP
PHP SQLite类
May 07 PHP
php MYSQL 数据备份类
Jun 19 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
Sep 12 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
Jun 23 PHP
phplot生成图片类用法详解
Jan 06 PHP
使用PHP生成二维码的方法汇总
Jul 22 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
Mar 21 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
php 数组元素快速去重
May 05 #PHP
Yii2实现自定义独立验证器的方法
May 05 #PHP
php 查找数组元素提高效率的方法详解
May 05 #PHP
thinkPHP分页功能实例详解
May 05 #PHP
php cli模式下获取参数的方法
May 05 #PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 #PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 #PHP
You might like
php长字符串定义方法
2012/07/12 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
图片自动更新(说明)
2006/10/02 Javascript
javascript prototype,executing,context,closure
2008/12/24 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
python Xpath语法的使用
2020/11/26 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
函数指针的定义是什么
2016/08/14 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
办理信用卡工作证明
2014/01/11 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
离婚起诉书范本
2015/05/18 职场文书