深入理解PHP的$_SESSION机制

本文由 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变现方案!

ChatMoney的头像ChatMoney
上一篇 2024年 8月 1日 上午10:57
下一篇 2024年 8月 3日 上午11:37

相关推荐

  • Android Studio下载Gradle超时解决方案

    本文由 ChatMoney团队出品 Android Studio 找到项目中 gradle 配置文件的路径,我的路径为 /你的项目路径/gradle/wrapper/gradle-wrapper.properties,里面对应内容应该如下所示: 超时原因是因为as(Android Studio,此后简称 as)中默认是从gradle官网去下载,此时我们有一个…

    2024年 7月 17日
    99
  • TypeScript中never类型的妙用

       本文由 ChatMoney团队出品 妙用一   当我们在一个项目中,可能会去改动一个在整个项目中应用很广泛的函数的参数类型,但是可能由于代码量比较庞大,我们不好排查改了之后哪些地方会出现问题,此时我们可以使用never类型来辅助我们的函数,当我们在原有的类型基础上添加了新的类型时,可能会导致else分支中的代码逻辑出现问题,此时我们…

    2024年 6月 12日
    121
  • 如何利用浏览器资源提示关键词优化网页性能

    本文由 ChatMoney团队出品 在现代Web开发中,页面加载速度对用户体验至关重要。浏览器提供了一些资源提示关键词(Resource Hints),帮助开发者优化页面加载速度。这些关键词包括 defer、async、preload、prefetch、dns-prefetch、prerender 和 preconnect。合理利用这些关键词,可以显著提高页…

    2024年 7月 11日
    86
  • Vue3中组件使用ref时获取组件类型推导

    本文由 ChatMoney团队出品 我们在使用Vue3+ts开发时,常常会用到一些第三方组件库,比如Element-Plus UI、Navie UI等,这些UI框架中有些组件常常会暴露一些方法给我们便捷的去实现各种复杂的交互,我们经常会像下面这样去给组件定义一个ref去获取组件的实例: 这个方法可以正常使用,但是没有任何的ts类型推导,这也就丧失了一部分我们…

    2024年 7月 12日
    106
  • ChatGPT提示词大全:涵盖各领域的使用指南

    本文由 ChatMoney团队出品 全新的GPT-4模型带来了许多改进,使得这款聊天机器人变得更智能,更难以被欺骗。因此,如果你是那少数想要使用它的人之一,可以看看如何免费使用ChatGPT-4,然后尝试下面的提示来测试这个机器人。 一、常规ChatGPT提示词 写一篇博客文章提示词:写一篇关于【在此处插入主题】的500字博客文章。 同义词提供者提示词:我希…

    2024年 6月 27日
    56

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信