会话处理是PHP中的一个关键概念,它使用户信息可以在网站或应用程序的所有页面上持久保存。 在本文中,您将学习PHP中会话处理的基础知识。
我们将首先说明会话的工作方式以及它们与cookie的关系。 然后,我们看一些代码片段,这些片段演示了如何使用会话。 您将学习如何创建和销毁会话,以及如何更改会话变量。
什么是PHP中的会话?
会话是一种在不同网页上保留信息以在用户浏览网站或应用程序时标识他们的机制。 您是否想知道为什么网站需要会话? 要了解为什么需要会话,我们必须回头看看HTTP协议是如何工作的。
HTTP协议是无状态协议,这意味着服务器无法记住多个请求之间的特定用户。 例如,当您访问网页时,服务器仅负责提供所请求页面的内容。 因此,当您访问同一网站的其他页面时,Web服务器将分别解释每个请求,就好像它们彼此无关。 服务器无法知道每个请求都来自同一用户。
下图概括地描述了HTTP协议。

在此模型中,如果要显示特定于用户的信息,则必须在每个请求中对用户进行身份验证。 想象一下,如果必须在显示您的个人资料信息的每个页面上键入用户名和密码! 是的,这将很麻烦并且根本不实用,这就是会议的主题。
会话使您可以在单个站点或应用程序的不同页面上共享信息,从而有助于维护状态。 这使服务器知道所有请求都来自同一用户,从而使站点可以显示特定于用户的信息和首选项。
会话和Cookie的登录流程
让我们快速浏览网站的通用登录流程,以了解幕后情况。
- 用户打开网站的登录页面。
- 提交登录表单后,另一端的服务器通过验证输入的凭据来验证请求。
- 如果用户输入的凭据有效,则服务器将创建一个新会话。 服务器生成一个唯一的随机数,称为会话ID。 它还在服务器上创建一个新文件,用于存储特定于会话的信息。
- 接下来,将会话ID以及请求的任何资源一起传递回用户。 在后台,此会话ID在响应标头中的
PHPSESSID
cookie中发送。 - 当浏览器从服务器收到响应时,它会遇到
PHPSESSID
cookie头。 如果浏览器允许使用cookie,它将保存此PHPSESSID
cookie,该cookie存储用于存储服务器传递的会话ID。
- 对于后续请求,
PHPSESSID
cookie被传递回服务器。 当服务器遇到PHPSESSID
cookie时,它将尝试使用该会话ID初始化会话。 通过加载会话初始化期间创建的会话文件来实现。 然后,它将使用存储在会话文件中的数据初始化超全局数组变量$_SESSION
。
这样,可以跨多个请求保留用户数据,并在整个会话中保持用户登录。
下图描述了HTTP协议如何与会话一起使用。

现在,您已经对会话的工作原理进行了简要介绍,我们将创建一些实际的示例来演示如何创建和操作会话变量。
如何开始会议
在本节中,我们将讨论如何在PHP中启动会话。
每当您要处理会话变量时,都需要确保会话已经启动。 您可以通过两种方式在PHP中启动会话。
使用session_start
函数
这是您最常看到的方法,其中由session_start
函数启动会话。
<?php
// start a session
session_start();
// manipulate session variables
?>
重要的是必须在脚本的开头调用session_start
函数,然后再将任何输出发送到浏览器。 否则,您将遇到臭名昭著的Headers are already sent
错误。
自动开始会议
如果需要在整个应用程序中使用会话,则还可以选择自动启动会话,而无需使用session_start
函数。
php.ini文件中有一个配置选项,可让您针对每个请求自动启动会话session.auto_start
。 默认情况下,它设置为0
,您可以将其设置为1
以启用自动启动功能。
session.auto_start = 1
另一方面,如果您无权访问php.ini文件,并且使用的是Apache Web服务器,则也可以使用.htaccess文件设置此变量。
php_value session.auto_start 1
如果在.htaccess文件中添加以上行,则应在PHP应用程序中自动启动会话。
如何获取会话ID
如前所述,服务器为每个新会话创建一个唯一的号码。 如果要获取会话ID,可以使用session_id
函数,如以下代码片段所示。
<?php
session_start();
echo session_id();
?>
那应该给你当前的会话ID。 session_id
函数很有趣,因为它也可以接受一个参数-会话ID。 如果要用自己的系统ID替换系统生成的会话ID,可以将其提供给session_id
函数的第一个参数。
<?php
session_id(YOUR_SESSION_ID);
session_start();
?>
重要的是要注意,当您要使用自定义会话ID启动会话时,必须将session_id
函数放置在session_start
调用之前。
如何创建会话变量
在本节中,我们将探讨如何在PHP中初始化会话变量。
如我们前面讨论的,一旦开始会话,将使用相应的会话信息初始化$_SESSION
超全局数组。 默认情况下,它使用空白数组初始化,并且您可以使用键值对存储更多信息。
让我们看一下以下示例脚本,该脚本演示了如何初始化会话变量。
<?php
// start a session
session_start();
// initialize session variables
$_SESSION['logged_in_user_id'] = '1';
$_SESSION['logged_in_user_name'] = 'Tutsplus';
// access session variables
echo $_SESSION['logged_in_user_id'];
echo $_SESSION['logged_in_user_name'];
?>
如您所见,我们已经使用session_start
函数在脚本的开头启动了会话。 之后,我们初始化了几个会话变量。 最后,我们使用$_SESSION
超全局变量访问了这些变量。
当使用$_SESSION
超全局$_SESSION
将数据存储在会话中时,数据最终将存储在服务器上的相应会话文件中,该文件是在启动会话时创建的。 这样,会话数据将在多个请求之间共享。
正如我们所讨论的,会话信息是跨请求共享的,因此在一个页面上初始化的会话变量也可以从其他页面访问,直到会话终止。 通常,关闭浏览器时,会话会过期。
如何修改和删除会话变量
您可以修改或删除应用程序中较早创建的会话变量,方法与常规PHP变量相同。
让我们看看如何修改会话变量。
<?php
session_start();
if (!isset($_SESSION['count']))
{
$_SESSION['count'] = 1;
}
else
{
++$_SESSION['count'];
}
echo $_SESSION['count'];
?>
在上面的脚本中,我们检查了是否首先设置了$_SESSION['count']
变量。 如果未设置,则将其设置为1
,否则将其增加1
。 因此,如果您多次刷新此页面,则应该看到计数器每次都增加一!
另一方面,如果要删除会话变量,则可以使用unset
函数,如以下代码片段所示。
<?php
// start a session
session_start();
// initialize a session variable
$_SESSION['logged_in_user_id'] = '1';
// unset a session variable
unset($_SESSION['logged_in_user_id']);
?>
因此,您将无法再访问$_SESSION['logged_in_user_id']
变量,因为该变量已由unset
函数删除。 这样便可以更改会话信息。
如何销毁会话
在本节中,我们将看到如何破坏会话。 在上一节中,我们讨论了unset
函数,该函数在您要删除特定的会话变量时使用。 另一方面,如果要一次删除所有与会话相关的数据,则可以使用session_destroy
函数。
session_destroy
函数删除当前会话中存储的所有内容。 话虽如此,它不会取消设置与会话关联的全局变量或未设置会话Cookie。
因此,如果您使用session_destroy
函数注销用户,则必须取消设置$_SESSION
变量,以及取消设置会话cookie。 因此,建议完全销毁会话的方法是:
<?php
// start a session
session_start();
// destroy everything in this session
unset($_SESSION);
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"],$params["httponly"]);
}
session_destroy();
?>
结论
在本文中,我们探讨了PHP中会话处理的基础。 这是一个关键概念,可让您在网页上保留信息。
在本文的前半部分,我们讨论了会话的基本概念,随后我们创建了一些PHP示例,以演示如何创建和销毁会话以及如何操作会话变量。
翻译自: https://code.tutsplus.com/tutorials/how-to-use-sessions-and-session-variables-in-php--cms-31839