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 session处理的定制
Mar 16 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
Jun 04 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
php mssql扩展SQL查询中文字段名解决方法
Oct 15 PHP
基于Zend的Captcha机制的应用
May 02 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
ThinkPHP验证码使用简明教程
Mar 05 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
php根据生日计算年龄的方法
Jul 13 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 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/02/04 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
php目录遍历函数opendir用法实例
2014/11/20 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
php中文语义分析实现方法示例
2019/09/28 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
JS中的作用域链
2017/03/01 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
Python中Continue语句的用法的举例详解
2015/05/14 Python
python爬取微信公众号文章的方法
2019/02/26 Python
Python Django搭建网站流程图解
2020/06/13 Python
学python最电脑配置有要求么
2020/07/05 Python
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
七年级英语教学反思
2014/01/15 职场文书
程序员求职信
2014/04/16 职场文书
事业单位鉴定材料
2014/05/25 职场文书
法制宣传标语集锦
2014/06/25 职场文书
QT与javascript交互数据的实现
2021/05/26 Javascript
用php如何解决大文件分片上传问题
2021/07/07 PHP
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫