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 02 PHP
PHP如何解决网站大流量与高并发的问题
Jun 25 PHP
使用dump函数,给php加断点测试
Jun 25 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
Sep 22 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
PHPStorm+XDebug进行调试图文教程
Jun 13 PHP
浅析PHP中的i++与++i的区别及效率
Jun 15 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
Nov 25 PHP
Yii CFileCache 获取不到值的原因分析
Feb 08 PHP
PHP分享图片的生成方法
Apr 25 PHP
laravel 框架配置404等异常页面
Jan 07 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
类的另类用法--数据的封装
2006/10/09 PHP
PHP Pear 安装及使用
2009/03/19 PHP
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
php实现监听事件
2013/11/06 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
php实现对象克隆的方法
2015/06/20 PHP
分享PHP守护进程类
2015/12/30 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
jquery异步请求实例代码
2011/06/21 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
微信小程序返回多级页面的实现方法
2017/10/27 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
django框架forms组件用法实例详解
2019/12/10 Python
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
大学四年个人的自我评价
2014/02/26 职场文书
2014年小学工作总结
2014/11/26 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书