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 相关文章推荐
基于mysql的论坛(5)
Oct 09 PHP
在MongoDB中模拟Auto Increment的php代码
Mar 06 PHP
smarty 缓存控制前的页面静态化原理
Mar 15 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
Yii调试SQL的常用方法
Jul 09 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
Mar 03 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
PHP 中TP5 Request 请求对象的实例详解
Jul 31 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
Aug 20 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 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中使用PDF文档功能
2006/10/09 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
PHP 透明水印生成代码
2012/08/27 PHP
PHP数据类型的总结分析
2013/06/13 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
如何在pycharm中安装第三方包
2020/10/27 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
大学生优秀团员事迹材料
2014/01/30 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
2016高考寄语集锦
2015/12/04 职场文书