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 相关文章推荐
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 PHP
php注入实例
Oct 09 PHP
PHP集成FCK的函数代码
Sep 27 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
phpmyadmin config.inc.php配置示例
Aug 27 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
Jun 07 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
phpQuery采集网页实现代码实例
Apr 02 PHP
详解Laravel服务容器的优势
May 29 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
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
Python 转义字符详细介绍
2017/03/21 Python
详解python中的文件与目录操作
2017/07/11 Python
Python优先队列实现方法示例
2017/09/21 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
Python中私有属性的定义方式
2020/03/05 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
Python如何使用ConfigParser读取配置文件
2020/11/12 Python
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
中医学专业自荐信范文
2014/04/01 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫