我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP重写session机制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHP重写session机制

众所周知,session在web应用中占有举足轻重的地位。而且,在很多情况下我们需要改变session的存储位置。当然了,改变session存储的位置可以在php.ini文件中直接修改。但是,这需要我们对服务器有足够的权限。可是事实却是在很多时候我们并没有权限去操作php.ini文件的权限。这时需要我们通过PHP提供的session_set_save_handler()函数来重写session。

针对这一情况,PHP 5 > 5.4和php 7 支持SessionHandlerInterface 接口。

SessionHandlerInterface {

    abstract public bool close ( void )
    abstract public bool destroy ( string $session_id )
    abstract public bool gc ( int $maxlifetime )
    abstract public bool open ( string $save_path , string $name )
    abstract public string read ( string $session_id )
    abstract public bool write ( string $session_id , string $session_data )
}

我们需要做的就是实现这个接口中的所有的方法。然后通过session_set_save_handler()函数来使方法生效。

注:本文中的例子是将session存到redis中。对于PHP如何操redis,大家可以参考《PHP操作Redis的两种方式》。

下面我们来分别介绍这些函数的实现方法。

open函数

abstract public bool SessionHandlerInterface ::open ( string $save_path , string $name ){}

重新初始化现有的session,抑或是创建一个session。该函数在session_start()函数执行的时候被调用。

$save_path 这个参数对应的就是php.ini中的session.save_path选项。这个选项设置的值就是$save_path的值。默认情况下,php.ini中session.save_path这个选项是被注释的,所以$save_path的值为空。举个例子:session.save_path设置为/tmp ,则$save_path的值为/tmp。

$name 这个参数对应的就是php.ini中的 session.name选项。默认情况下session.name设置为PHPSESSID。 所以说$name参数值为PHPSESSID。

我在实现这个函数的时候没有做其他的处理(因为我想将session存到redis中),只是连接了redis数据库。

public function open($save_path, $name){
       
        $this->parseConnect();
        return true;
       
 }

close函数

abstract public bool SessionHandlerInterface :: close(){}

关闭当前的session。该函数在当关闭session的时候被自动触发,或者在程序中调用session_write_close()函数是触发close()函数。

在实现该函数时没有做什么特殊的处理

public function close(){
        return true;
}

read函数

abstract public bool SessionHandlerInterface :: read($session_id){}

读取session数据。当调用session_start()函数的时候会触发read()函数。当然该函数的触发是在open之后的。

$session_id 该参数就是对应的由客户端传过来的sessionId。所有的操作都需要根据这个sessionId来进行。

public function read($session_id){
       
        $key = $this->prefix.':'.$session_id;
        //读取当前sessionid下的data数据
        $res = $this->handle->hGet($key,'data');
        //读取完成以后 更新时间,说明已经操作过session
        $this->handle->hSet($key,'last_time',time());
        return $res;       
 }

write函数

abstract public bool SessionHandlerInterface :: write($session_id , $session_data){}

该函数是将session的数据写到相应的位置去。当操作$_SESSION来序列化数据的时候该函数被触发。

$session_id 这个参数就是我们上面所说的sessionId。

$session_data 是我们要存储的数据。这里需要说明一下,我们通过$_SESSION来设置数据的时候,第一次我们设置了$_SESSION[‘login’] = ‘ok’,这时$session_data的值为login|s:2:ok。write会把login|s:2:ok写入到redis中。然后我们不退出session,再次设置$_SESSION[‘name’] = ‘onmpw’。这时$session_data的值不只是name|s:5:onmpw,而是login|s:2:ok;name|s:5:onmpw。因为在write之前会先触发read来读取redis中的数据。读取到数据以后将这些数据连同通过$_SESSION[‘name’] = ‘onmpw’得到的值一块儿作为$session_data参数的值来进行更新。

public function write($session_id, $session_data){
       
        $key = $this->prefix.':'.$session_id;
        //查看该键内容是否存在
        if(!$this->handle->exists($key)){
           
            $this->handle->hset($key,'last_time',time());
        }else{
           
            $this->handle->hMset($key,array('last_time'=>time(),'data'=>$session_data));
        }
        return true;
       
}

destroy函数

abstract public bool SessionHandlerInterface ::destroy($session_id){}

当函数session_destroy()调用的时候触发该函数。这时我们可以在该函数中将$session_id对应的数据销毁掉

public function destroy($session_id){
       
        $key = $this->prefix.':'.$session_id;
        $this->handle->hDel($key,'data');
}

gc函数

abstract public bool SessionHandlerInterface ::gc($maxlifetime){}

清除垃圾session,也就是清除过期的session。该函数是基于php.ini中的配置选项:session.gc_divisor, session.gc_probability 和 session.gc_lifetime所设置的值的。

$maxlifetime 参数的值就是 session.gc_lifetime选项所设置的值。

这个函数是否被触发要取决于session.gc_divisor和session.gc_probability这两个选项。该函数被触发的概率为 session.gc_probability/session.gc_divisor。如果probability设置为1,divisor设置为100。那么gc函数被触发的概率就是1%。也就是说在100个请求中可能会在某一个请求过程中触发这个函数。从这里我们可以知道,如果客户端一直没有请求,那这个函数就永远不会被触发。即使有些session信息没被操作的时间已经超过了session.gc_lifetime所设置的时间。

那什么是过期的session呢?这么来说吧,假如session.gc_lifetime设置的值为30(默认单位为s 秒),一条session信息,从最后一次被操作的时间开始计时,如果在30秒内没有再被操作,那这条session就被定为垃圾信息了。当gc函数被触发的时候这条信息就被清除掉了。如果说,你在30秒内又对这条session信息进行了操作——即使是在29s的时候,那这条session信息会在你最近操作的这一时刻开始再重新计时30秒。

public function gc($maxlifetime){
       
        $keys = $this->handle->keys($this->prefix.'*');
       
        $now =time(); //取得现在的时间
        foreach($keys as $key){
            //取得当前key的最后更新时间
            $last_time = $this->handle->hGet($key,'last_time');
           
            if(($now - $last_time) > $maxlifetime){
                //超过了最大生命周期时间 则删除该key
                $this->handle->del($key);
            }
           
        }    
 }

上面就是我们在重写session机制中会用到的几个函数。上面的部分代码是我写的将session保存到redis中的一个例子中的部分代码。大家可以从 https://github.com/onmpw/PHPLibrary/tree/master/Code/Session 查看完整代码。希望本文对大家有帮助。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHP重写session机制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP重写session机制

众所周知,session在web应用中占有举足轻重的地位。而且,在很多情况下我们需要改变session的存储位置。当然了,改变session存储的位置可以在php.ini文件中直接修改。但是,这需要我们对服务器有足够的权限。可是事实却是在很
PHP重写session机制
2024-02-27

理解cookie和session机制

cookie和session机制之间的区别与联系
2023-06-03

完善 PHP Session 跨域的错误处理机制

在日常的 Web 开发中,我们经常使用 Session 来存储用户的登录状态、购物车信息等。然而,由于跨域访问的限制,PHP Session 在不同域名之间的传递会面临一些问题。为了解决这些问题,我们需要对 PHP Session 实现适当
2023-10-21

PHP Session 跨域的数据一致性验证机制

随着互联网的发展,跨域访问成为了常见的需求,而在进行跨域访问时,保持数据一致性成为了一项重要的挑战。PHP提供了Session机制用于在不同请求间保持数据的一致性,但默认情况下,Session的跨域访问是无法实现的。本文将介绍一种基于Tok
2023-10-21

深入研究 PHP Session 跨域的数据传输机制

Session是一种在Web开发中用于保存用户状态的机制,它提供了一种持久化保存用户数据的方式,使得用户可以在不同页面间保持登录状态。然而,当涉及跨域的数据传输时,Session机制可能面临一些挑战。在PHP中,Session是通过HTTP
2023-10-21

C++ 函数重写的边界:探索继承中重写机制的局限

在c++++中,函数重写受到以下限制: 1. 不可重写构造函数和析构函数; 2. 重写函数的访问权限必须与基类相同或更宽松; 3. 重写函数的参数列表和返回值类型必须与基类一致; 4. 不可重写static函数。C++ 函数重写的边界:探索
C++ 函数重写的边界:探索继承中重写机制的局限
2024-05-03

php中session写入失败怎么解决

本篇内容主要讲解“php中session写入失败怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中session写入失败怎么解决”吧!php session写入失败是因为把sessi
2023-06-20

网站的session机制是什么呢

本篇文章给大家分享的是有关网站的session机制是什么呢,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 session是另一种记录客户状态的机制,不同的是cookie保存在客
2023-06-07

Session消失机制的示例分析

小编给大家分享一下Session消失机制的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!以前一直以为cookie就是一直保存在客户端的会话信息,而session是保存在服务器断的会话信息,浏览器关闭以后就会被清除发
2023-06-27

PHP 函数的重载和重写

php中支持函数重载和重写,可创建灵活可重用的代码。函数重载:允许创建同名函数,但参数不同,根据参数匹配情况调用最合适的函数。函数重写:允许子类定义同名函数,覆盖父类方法,子类方法调用时将覆盖父类方法。PHP 中的函数重载和重写PHP 支
PHP 函数的重载和重写
2024-04-26

如何用Ajax + PHP session制作购物车

这篇文章主要介绍“如何用Ajax + PHP session制作购物车”,在日常操作中,相信很多人在如何用Ajax + PHP session制作购物车问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Aj
2023-06-08

关于ZooKeeper的会话机制Session解读

这篇文章主要介绍了关于ZooKeeper的会话机制Session解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-15

PHP和 ASP.NET在Session实现和管理机制上有什么差异

本篇内容介绍了“PHP和 ASP.NET在Session实现和管理机制上有什么差异”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Sessio
2023-06-03

Tomcat中的Session管理机制是什么

Tomcat中的Session管理机制是通过Servlet容器来管理Session对象的。Tomcat会为每个用户创建一个Session对象,用于存储用户的会话信息,并为每个Session对象分配一个唯一的标识符,称为Session ID。
Tomcat中的Session管理机制是什么
2024-04-03

php重复开启session问题怎么解决

在PHP中,如果重复开启session会导致出错或者session数据丢失。为了解决这个问题,可以使用session_id()函数来判断session是否已经开启,只有在session没有开启的情况下才开启session。下面是一个示例代码
2023-08-17

php中重写override的方法

这篇文章主要介绍了php中重写override的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 定义:重写(override),即子类中定义了与父类重名的成员,子类可以重
2023-06-06

PHP Session 跨域的功能扩展与定制化

简介:PHP 是一种常用的服务器端脚本语言,用于开发动态网站和 Web 应用程序。在 PHP 中,Session 是一种用于在不同页面之间共享数据的机制。然而,当存在跨域请求时,Session 的默认功能可能会受到限制。本文将介绍如何扩展和
2023-10-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录