在PHP中会话处理是一个很重要的概念,它允许用户信息在网站或应用程序的所有页面上保持不变。下面本篇文章就来带大家学习一下PHP中会话处理的基础知识,希望对大家有所帮助。

PHP中什么是会话(session)?

会话(session)是一种在不同网页上保留信息的机制,用于在用户浏览网站或应用时识别用户。

大家一定会有这样一个疑问:为什么网站需要会话?讨论这个问题前,我们需要回过头来看看HTTP协议是如何工作的。

HTTP协议是无状态协议,这意味着服务器无法在多个请求之间记住特定用户。例如,当您访问网页时,服务器只负责提供所请求页面的内容。因此,当您访问同一网站的其他页面时,Web服务器会分别解释每个请求,就好像它们彼此无关。服务器无法知道每个请求都来自同一个用户。

下图简要描述了HTTP协议。

在这个过程中,如果想要显示特定用户的信息,则必须在每个请求中对用户进行身份验证。想象一下如果每次发出请求时,都需要进行在页面上输入用户名和密码进行身份验证;这样实在太繁琐了,根本不实用。而,会话(session)在这个时间就派上用场了。

会话(session)允许用户跨单个站点或应用程序的不同页面共享信息, 因此它有助于维护状态。这使服务器知道所有请求都来自同一用户,从而允许站点显示用户特定的信息和首选项。

下图描述了HTTP协议如何与会话一起使用。

PHP如何进行会话处理?

1、启动会话

每当想要处理会话变量时,就需要确保会话已经启动。有几种方法可以在PHP中启动会话。

1)、使用session_start函数

这是最常见到的方法,其中会话由session_start函数启动。

重要的是,session_start在将任何输出发送到浏览器之前,必须在脚本的开头调用该函数。否则,你会遇到臭名昭着的Headers are already sent错误。

2)、自动启动会话

如果需要在整个应用程序中使用会话,还可以选择自动启动会话而不使用session_start函数。

php.ini文件中有一个配置选项session.auto_start,允许我们为每个请求自动启动会话。默认情况下,它设置为0,我们可以将其设置1为启用自动启动功能。

2、获取会话ID

服务器为每个新会话创建一个唯一的id。如果要获取会话ID,可以使用该session_id功能,如以下代码段所示。

这应该给你当前的会话ID。该session_id函数很有趣,因为它也可以使用一个参数 - 一个会话ID。如果要将系统生成的会话ID替换为您自己的会话ID,可以将其提供给session_id函数的第一个参数。

重要的是要注意,当您想要使用自定义会话ID启动会话时,必须将session_id函数放在session_start之前调用。

3、创建会话变量

一旦启动会话,$_SESSION就会使用相应的会话信息初始化超全局数组。默认情况下,它使用空白数组初始化,您可以使用键值对存储更多信息。

下面我们通过代码示例来看看如何初始化会话变量。

如上所示,我们使用session_start函数在脚本开头启动了一个会话;之后,初始化了几个会话变量;最后,我们使用$_SESSION超全局访问了这些变量。

使用$_SESSION超全局将数据存储在会话中时,它最终存储在会话启动时创建的服务器上的相应会话文件中。通过这种方式,会话数据在多个请求之间共享。

正如我们所讨论的,会话信息在请求之间共享,因此在一个页面上初始化的会话变量也可以从其他页面访问,直到会话到期为止。通常,会话在浏览器关闭时到期。

4、修改和删除会话变量

我们可以像修改常规PHP变量一样修改或删除先前在应用程序中创建的会话变量。

下面通过示例来看看如何修改会话变量。

在上面的脚本中,我们首先检查了是否设置了$_session['count']变量。如果没有设置,我们将设置为1,否则我们将增加1。因此,如果多次刷新此页,可以看到计数器每次递增一个!

另一方面,如果想要删除会话变量,可以使用unset函数,如下面的代码段所示:

这样,我们就无法再访问$_SESSION[‘logged_in_user_id’]变量了。因为它已被unset函数删除。

5、销毁会话

在上面我们知道可以使用unset函数来删除特定的会话变量;那么如果要一次删除所有与会话相关的数据,我们要怎么办?

其实很简单,我们可以使用session_destroy函数。

下面我们来看看session_destroy函数是如何工作的。

说明:session_destroy函数删除存储在当前会话中的所有内容。因此,当存储在磁盘上的会话数据被session_destroy函数删除时,我们将从后续请求中看到一个空的会话变量。

注:通常,在用户注销时才会使用session_destroy函数

有需要学习交流的友人请加入交流群的咱们一起,群内都是1-7年的开发者,希望可以一起交流,探讨PHP,swoole这块的技术 或者有其他问题 也可以问,获取swoole或者php进阶相关资料私聊管理即可

别忘了点赞哦,定期分享干货

点此加入该群​jq.qq.com

如何在PHP中进行会话处理?的更多相关文章

  1. 如何在Linux中使用sFTP上传或下载文件与文件夹

    如何在Linux中使用sFTP上传或下载文件与文件夹 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全;它通过 ...

  2. 如何在Linux中自动删除或清理/tmp文件夹内容?

    每个Linux系统都有一个名为的目录/tmp,该目录已挂载了单独的文件系统. 它具有称为tmpfs的特殊文件系统.这是一个虚拟文件系统,操作系统将在系统引导时自动挂载/tmp挂载点. 如果要根据应用程 ...

  3. Linux入门进阶 - 如何在Linux中使用export命令

    来自:Linux迷链接:https://www.linuxmi.com/linux-export.html Linux export命令会标记哪些值需要传递给一组子进程.这是bash shell提供的 ...

  4. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  5. 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧

    做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...

  6. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...

  7. 如何正确的使用json?如何在.Net中使用json?

    什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...

  8. [原创]如何在Parcelable中使用泛型

    [原创]如何在Parcelable中使用泛型 实体类在实现Parcelable接口时,除了要实现它的几个方法之外,还另外要定义一个静态常量CREATOR,如下例所示: public static cl ...

  9. 如何在springMVC 中对REST服务使用mockmvc 做测试

    如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试  spring 集成测试中对mock 的集成实在是太棒了!但 ...

随机推荐

  1. 使用KVC键值编码

    掌握KVC从不使用setter.getter.点语法开始. ----- 前言 对象的内部状态是由属性进行封装的.访问对象属性的方式平时在开发过程中用得最多的是getter方法和点语法.键值编程KVC也 ...

  2. json字符串转换成json增删查改节点

    一.功能实现 1.节点树查询: 按ID查询树 2.节点新增: http://host/tree_data/node/${treeId} in: {node: {key: ..., ...}, pare ...

  3. Codeforces Round #617 (Div. 3)A. Array with Odd Sum(水题)

    You are given an array aa consisting of nn integers. In one move, you can choose two indices 1≤i,j≤n ...

  4. http的3次握手与4次挥手

    Http的3次握手: 第一次握手:客户端发送一个带SYN的TCP报文到服务器,表示客户端想要和服务器端建立连接. 第二次握手:服务器端接收到客户端的请求,返回客户端报文,这个报文带有SYN和ACK确认 ...

  5. Sping IOC容器

    Sping IOC容器 package servlet; import org.springframework.context.ApplicationContext; import org.sprin ...

  6. JDBC 存储过程

    存储过程 DROP PROCEDURE IF EXISTS `addUser`; CREATE PROCEDURE `addUser` (),in birthday date,in money flo ...

  7. redis小功能大用处-bitmaps

  8. AutoITx3.DLL所有函数及说明

    AutoItSetOption    调整各种函数/参数的运作方式. BlockInput    屏蔽/启用鼠标与键盘(输入). CDTray    弹出或关闭光驱. ClipGet    获取剪贴板 ...

  9. JMeter配置JDBC测试SQL Server/MySQL/ORACLE

    一.配置SQL Server 1.下载sql驱动,将sqljdbc4.jar放到JMeter安装目录/lib下. 2.启动JMeter,右键添加->配置文件->JDBC Connectio ...

  10. PHP pclzip.php 解压中文乱码

    修改 pclzip中方法privExtractFile 代码 if ($p_path != '') { $p_entry['filename'] = $p_path."/".$p_ ...