• PHP会话技术session我不允许还有人不会!



    在这里插入图片描述

    🎬 鸽芷咕个人主页

     🔥 个人专栏:《速学数据结构》 《C语言进阶篇》

    ⛺️生活的理想,就是为了理想的生活!

    一、Session简介

    Session在网络应用中称为“会话”,在PHP 中用于保存用户连续访问Web应用时的相关数据,有助于创建高度定制化的程序、增加站点的吸引力。

    1.1 Session的应用场景

    在这里插入图片描述

    Session是一种服务器端的技术,它的生命周期从用户访问页面开始,直到断开与网站的连接时结束。

    当PHP启动Session时,Web服务器在运行时会为每个用户的浏览器创建一个供其独享的Session文件。
    在这里插入图片描述

    在创建Session文件时,每一个Session都具有一个唯一的会话ID,用于标识不同的用户,且会话ID会分别保存在客户端和服务器端两个位置。
    客户端通过Cookie保存,服务器端则以文件的形式保存到php.ini指定的Session目录中,对于Windows系统,默认情况下保存到“C:\Windows\Temp”目录中。

    二. Session基本使用

    2.1 启动Session

    在使用Session之前,需要先通过session_start()函数启动Session。该函数的返回值是布尔类型,如果Session启动成功,返回true,否则返回false。
    在这里插入图片描述

    test1.php代码如下:
    在这里插入图片描述

    2.2 查看SessionID与Session文件

    浏览器访问开启Session的文件,可在开发者工具中查看Cookie中保存的会话ID。

    • Cookie名称“PHPSESSID”是php.ini中配置项session.name的默认值

    • 在服务器中,打开Session文件默认的保存目录“C:\Windows\Temp”。

    服务器保存了文件名为“sess_会话ID”的Session文件,该文件的会话ID与浏览器Cookie中显示的会话ID一致,表示这个文件只允许拥有会话ID的用户访问。

    2.3 Session的使用

    在完成Session的启动后,接下来Session的使用与Cookie的用法类似,可以通过超全局变量$_SESSION添加、读取或修改Session中的数据。

    2.4 Session的配置

    php.ini中与Session相关的配置

    配置项	含义
    session.name	指定Cookie的名字,只能由字母数字组成,默认为PHPSESSID
    session.save_path	读取或设置当前会话文件的保存路径,默认为“C:\Windows\Temp”
    session.auto_start	指定是否在请求开始时自动启动一个会话,默认为0(不启动)
    session.cookie_lifetime	以秒数指定发送到浏览器的Cookie生命周期,默认为0(直到关闭浏览器)
    session.cookie_path	指定要设定会话Cookie的路径,默认为“/”
    session.cookie_domain	指定要设定会话Cookie的域名,默认为无
    session.cookie_secure	指定是否仅通过安全连接发送Cookie,默认为off
    session.cookie_httponly	指定是否仅通过HTTP访问Cookie,默认为off
    从PHP 7.0版本开始,可以在程序中通过session_start()函数的参数对Session进行配置,用于覆盖php.ini中对应的Session配置指令,示例代码如下。
    session_start(['name' => 'MySESSID']);
    
    Session机制
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    默认情况下,PHP中的Session是通过实现SessionHandlerInterface接口,将其以文件的形式存储在服务器中的。该接口中有6个抽象方法。

    interface SessionHandlerInterface
    {
        public function close();
        public function destroy(string $session_id);
        public function gc(int $maxlifetime);
        public function open(string $save_path, string $session_name);
        public function read(string $session_id);
        public function write(string $session_id, string $session_data);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    对于访问量非常大的网站,在服务器中需要存储大量的Session文件,这将影响服务器的响应速度并会带来资源浪费。
    因此,只要重新实现SessionHandlerInterface接口,完成具体方法的实现,然后再利用PHP提供的Session机制就可以改变Session存储的默认方式。

    • PHP的Session机制是通过调用session_set_save_handler()函数实现的,在调用此函数时,可以传递对应的回调函数或类的示例。

    示例:

    1. 创建数据库
    CREATE DATABASE `sess_storage`;      # 创建数据库
    USE `sess_storage`;                  # 选择数据库
    CREATE TABLE `session` (             # 创建用于保存Session的数据表
      `id` VARCHAR(255) PRIMARY KEY COMMENT 'SessionID',
      `expires` INT UNSIGNED NOT NULL COMMENT '过期时间',
      `data` BLOB COMMENT '数据'
    ) DEFAULT CHARSET=utf8;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 创建SessionDb.php,实现SessionHandlerInterface
    
    class SessionDb implements SessionHandlerInterface{
        private $link;
        public function open($savePath, $sessionName){
            $this->link = new mysqli('localhost', 'root', '123456', 'sess_storage');
            return (bool) $this->link;
        }
    
        public function close(){
            return $this->link->close();
        }
        
        public function write($id, $data) {
            $expires = time() + 3600;
            $sql = 'REPLACE INTO `session`  SET `id` = ?, `expires` =?, `data` = ?';
            $stmt = $this->link->prepare($sql);
            $stmt->bind_param('sis', $id, $expires, $data);
            return (bool) $stmt->execute();
        }
        
        public function read($id) {
            $now = time();
            $sql = "SELECT `data` FROM `session` WHERE `id` = '$id'  AND `expires` > $now";
            return (string) $this->link->query($sql)->fetch_assoc()['data'];
        }
        
        public function destroy($id) {
            $sql = "DELETE FROM `session` WHERE `id` = $id";
            return (bool) $this->link->query($sql);
        }
        
        public function gc($maxlifetime) {
            $sql = "DELETE FROM `session` WHERE (`expires` + $maxlifetime ) < $maxlifetime)";
            $result = $this->link->query($sql);
            return (bool) $result;
        }
        
        public function __construct() {
            session_set_save_handler($this, true);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    1. 测试:
    
    require './SessionDb.php';
    new SessionDb();    // 配置Session入库
    session_start();    // 启动Session
    $_SESSION['test'] = 'content';
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    📝全篇总结

    看到这里了还不给博主扣个:
    ⛳️ 点赞☀️收藏 ⭐️ 关注

    💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
    拜托拜托这个真的很重要!
    你们的点赞就是博主更新最大的动力!
    有问题可以评论或者私信呢秒回哦。
    在这里插入图片描述

  • 相关阅读:
    (02)Cartographer源码无死角解析-(28) GlobalTrajectoryBuilder构建过程与整体分析
    利用梯度上升可视化卷积核:基于torch实现
    算法笔记之蓝桥杯&pat系统备考(2)
    Java运算符和表达式
    软件开发项目文档系列之十二如何撰写用户培训方案
    权限管理之多租户隔离授权
    超详细的Linux环境如何搭建禅道
    docker、docker-compose 下安装elasticsearch、IK分词器
    JDK17 比较实用的更新
    Android笔记(二十八):在雷电模拟器安卓7.0+上使用Charles抓包详细教程
  • 原文地址:https://blog.csdn.net/qq_57761637/article/details/133805025