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

简介: 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机制

默认情况下,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);
}

对于访问量非常大的网站,在服务器中需要存储大量的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. 创建SessionDb.php,实现SessionHandlerInterface
<?php
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. 测试:
<?php
require './SessionDb.php';
new SessionDb();    // 配置Session入库
session_start();    // 启动Session
$_SESSION['test'] = 'content';
?>

📝全篇总结

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

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖

拜托拜托这个真的很重要!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。


目录
相关文章
|
1月前
|
安全 数据库连接 PHP
PHP编程中的关键性技术探究
在当今信息化社会,PHP作为一种流行的服务器端脚本语言,已经被广泛应用于网站开发和动态网页生成等领域。本文将深入探讨PHP编程中的关键性技术,包括数据库连接、安全性防护、性能优化等方面,旨在帮助读者更好地理解和运用PHP语言。
|
1月前
|
程序员 PHP
PHP程序员的成长之路:技术探索与实践
在当今数字化时代,PHP作为一种广泛应用的后端编程语言,对于程序员而言具有重要意义。本文从技术探索和实践的角度出发,探讨了PHP程序员在成长过程中所面临的挑战与机遇,以及如何通过持续学习与实践不断提升自身技能。
|
1月前
|
SQL 缓存 PHP
PHP技术探究:优化数据库查询效率的实用方法
本文将深入探讨PHP中优化数据库查询效率的实用方法,包括索引优化、SQL语句优化以及缓存机制的应用。通过合理的优化策略和技巧,可以显著提升系统性能,提高用户体验,是PHP开发者不容忽视的重要议题。
|
29天前
|
程序员 PHP 数据库
PHP程序员的技术成长之路
本文将深入探讨PHP程序员在技术成长过程中所面临的挑战和应对策略,包括学习曲线的克服、项目经验的积累以及持续学习的重要性,旨在帮助PHP程序员更好地提升自身技术水平。
|
1月前
|
数据采集 存储 JavaScript
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
本文旨在介绍如何利用PHP中的simple_html_dom库结合爬虫代理IP技术来高效采集和分析汽车之家网站的电动车参数。通过实际示例和详细说明,读者将了解如何实现数据分析和爬虫技术的结合应用,从而更好地理解和应用相关技术。
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
|
3月前
|
存储 安全 PHP
php案例 解决cookie失效后使用session的问题
php案例 解决cookie失效后使用session的问题
php案例 解决cookie失效后使用session的问题
|
存储 安全 PHP
为什么PHP的session的底层实现是基于HTTP cookie机制?底层原理是什么?
为什么PHP的session的底层实现是基于HTTP cookie机制?底层原理是什么?