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数据库配置文件一般做法分享
Jul 07 PHP
腾讯QQ微博API接口获取微博内容
Oct 30 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
php开发工具有哪五款
Nov 09 PHP
php获取文件后缀的9种方法
Mar 22 PHP
PHP输出多个元素的排列或组合的方法
Mar 14 PHP
php闭包中使用use声明变量的作用域实例分析
Aug 09 PHP
laravel 框架执行流程与原理简单分析
Feb 01 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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
vue中appear的用法
2017/08/17 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
Python入门学习之字符串与比较运算符
2015/10/12 Python
python正则表达式之作业计算器
2016/03/18 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
python能开发游戏吗
2020/06/11 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
shell的种类有哪些
2015/04/15 面试题
司机职责范本
2014/03/08 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
法务专员岗位职责
2015/02/14 职场文书
Python 中的 copy()和deepcopy()
2021/11/07 Python
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL