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网上调查系统
Oct 09 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
Nov 01 PHP
UCenter 批量添加用户的php代码
Jul 17 PHP
thinkphp实现数组分页示例
Apr 13 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
phpStudy访问速度慢和启动失败的解决办法
Nov 19 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 PHP
php车辆违章查询数据示例
Oct 14 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
php中数组最简单的使用方法
Dec 27 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代码实现表单数据验证类
2015/07/28 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
专业实习自我鉴定
2013/10/29 职场文书
工程项目建议书范文
2014/03/12 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏