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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
Oct 09 PHP
PHP 图片上传实现代码 带详细注释
Apr 29 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
PHP函数http_build_query使用详解
Aug 20 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
[原创]php获取数组中键值最大数组项的索引值
Mar 17 PHP
PHP SplObjectStorage使用实例
May 12 PHP
thinkPHP下ueditor的使用方法详解
Dec 26 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
May 28 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
支持oicq头像的留言簿(一)
2006/10/09 PHP
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
javascript 二维数组的实现与应用
2010/03/16 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
python根据日期返回星期几的方法
2015/07/06 Python
常用python编程模板汇总
2016/02/12 Python
python 删除列表里所有空格项的方法总结
2018/04/18 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
函授本科个人自我鉴定
2014/03/25 职场文书
面试必备的求职信
2014/05/25 职场文书
师范生求职自荐信
2014/06/14 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
个人求职信格式范文
2015/03/20 职场文书
施工安全责任协议书
2016/03/23 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python