首页 > 编程语言 >深入理解PHP的$_SESSION机制

深入理解PHP的$_SESSION机制

时间:2024-08-02 10:56:32浏览次数:14  
标签:SESSION Session start session Cookie 深入 PHP ID

本文由 ChatMoney团队出品

PHP****中Session的声明与使用

在PHP中,Session的设置与管理与Cookie不同,必须首先启动。这通过调用session_start()函数来完成。该函数的语法格式为:

bool session_start(void)

注意:在调用session_start()之前不能有任何输出。

当用户第一次访问网站时,session_start()会创建一个唯一的Session ID,并通过HTTP响应头将这个ID保存到客户端的Cookie中。同时,在服务器端也会创建一个以Session ID命名的文件,用于保存该用户的会话信息。

用户再次访问时,通过HTTP请求头携带Cookie中的Session ID。这时,session_start()不会创建新的Session ID,而是在服务器上查找与Session ID同名的文件,并应用之前保存的会话信息。

Session通过数组形式使用,例如:$_SESSION['session名']

注册和读取Session变量

在PHP中使用Session变量,除了启动外,还需注册。注册和读取Session变量都通过$_SESSION数组完成。例如:

<?php    
    session_start();
    $_SESSION["username"]="skygao";
    $_SESSION["uid"]=1;
?>

执行后,变量会被保存在服务器端的文件中。

注销变量与销毁Session

使用完Session变量后,可以删除。用户退出时,应销毁其所有信息。

  • 使用session_destroy()函数可以销毁所有与当前Session相关的资料。

  • 使用unset()函数可以释放单个Session变量。

  • 清除客户端Cookie中的Session ID,需要使用setCookie()函数。

例如:

<?php
    session_start();
    $_SESSION = array();
    if(isset($_COOKIE[session_name()])) {
        setCookie(session_name(), "", time()-42000, "/");
    }
    session_destroy();
?>

php.ini中的Session配置选项

  • session.auto_start:请求启动时初始化Session。

  • session.cache_expire:设置缓存中的会话文档过期时间。

  • session.cookie_lifetime:设置Cookie的保存时间,即Session的过期时间。

  • session.cookie_path:Cookie的有效路径。

  • session.cookie_domain:Cookie的有效域。

  • session.name:用于Cookie中的Session名称。

  • session.save_handler:用于保存/取回数据的控制方式。

  • session.save_path:数据文件保存的路径。

  • session.use_cookies:是否使用cookies。

Session的垃圾自动回收机制

当用户未正常退出而直接关闭浏览器时,服务器端的Session文件不会被删除。为了清理这些“垃圾”,PHP有一个自动回收机制。

  • session.gc_maxlifetime:指定过期时间。

  • session.gc_probabilitysession.gc_divisor:设置垃圾回收程序的概率。

例如,如果session.gc_probability=1session.gc_divisor=100,则概率为“1/100”。

Cookie禁用时通过URL传递****Session ID

如果客户端禁用Cookie,PHP可以自动将Session ID添加到URL中。在Linux平台上,如果客户端禁用Cookie,系统会自动修改URL以包含Session ID。在Windows平台上,可以使用常量SID来实现相同功能。

例如:

<?php
    session_start();
    echo '<a href="demo.php?'.session_name().'='.session_id().'">连接演示</a>';
?>

关于我们

本文由ChatMoney团队出品,ChatMoney专注于AI应用落地与变现,我们提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney获取更多AI变现方案!

标签:SESSION,Session,start,session,Cookie,深入,PHP,ID
From: https://www.cnblogs.com/chatrun/p/18338297

相关文章

  • 深入理解PHP8的新特性:如何高效使用异步编程和代码
    PHP8是PHP编程语言的最新主要版本,带来了许多令人兴奋的新特性和改进。其中最突出的特性之一是对异步编程的支持。异步编程允许我们在处理并发任务时提高性能和响应能力。本文将深入探讨PHP8的异步编程特性,并介绍如何高效地使用它们。首先,让我们了解一下什么是异步编程。在传统的......
  • Laravel php框架与Yii php 框架的优缺点
    Laravel和Yii都是流行的PHP框架,它们各自具有独特的优点和缺点。以下是对这两个框架优缺点的详细分析:LaravelPHP框架的优缺点优点1、设计思想先进:Laravel的设计思想非常先进,非常适合应用各种开发模式,如TDD(测试驱动开发)、DDD(领域驱动设计)和BDD(行为驱动开发)。2、功能丰富:L......
  • 深入理解C语言中的结构体
    目录引言一.结构体的基本概念1.结构体的声明2.结构体变量的创建和初始化3.结构体成员访问操作符4.结构体的特殊声明1.匿名结构体2.嵌套结构体3.结构体自引用4.typedef声明二、结构体内存对⻬1.对⻬规则2.为什么存在内存对⻬?3.修改默认对齐数三、结构体......
  • 深入理解PHP数组反转的算法
    本文由ChatMoney团队出品在PHP开发中,数组反转是一个常见的操作,它涉及到将数组的键值对或者键的顺序进行倒序排列。本文将深入探讨PHP数组反转的算法,并提供相应的代码示例。一、PHP数组反转基础在PHP中,数组反转通常涉及到两个函数:array_reverse()和array_flip()。......
  • 对于PHP数组反转的算法的深度理解
    本文由ChatMoney团队出品在PHP开发中,数组反转是一个常见的操作,它涉及到将数组的键值对或者键的顺序进行倒序排列。本文将深入探讨PHP数组反转的算法,并提供相应的代码示例。一、PHP数组反转基础在PHP中,数组反转通常涉及到两个函数:array_reverse()和array_flip()。......
  • C语言中的条件判断与分支选择:深入解析if, else, else if与switch
    引言在C语言编程中,条件判断与分支选择是构建复杂逻辑、实现不同场景下代码执行路径分流的基石。if、else、elseif以及switch语句作为C语言提供的强大工具,让我们能够根据条件表达式的真假值,灵活地控制程序的执行流程。本文将带您深入探索这些判断语句的语法细节、使用场景及最佳......
  • 《深入浅出WPF》学习笔记三.x命名空间以及常见属性
    《深入浅出WPF》学习笔记三.x命名空间以及常见属性X命名空间的由来和作用xaml:是eXtensibleApplicationMarkupLanguage的英文缩写(可扩展应用程序标记语言);声明       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"使用x:Class="WpfApp10.Main......
  • 深入理解MyCAT分库分表机制:架构师的秘密武器
    一、MyCAT分库和分表的概念1.分库(DatabaseSharding)分库是将一个大数据库拆分成多个小数据库,以减小单个数据库的压力并提高系统的扩展性。每个子数据库可以分布在不同的服务器上,从而分散负载并提高性能。示例:假设我们有一个用户信息数据库users_db,其中包含了大量的用......
  • 类和对象的深入了解6
    1.初始化列表初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。classDate{public:Date(intyear,intmonth,intday):_year(year),_month(month),_day(day){}private:int_year;......
  • 类和对象的深入了解7
    1.static成员1.1概念声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。1.2特性1.静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区。2.静态......