PHP 会话

在本教程中,你将学习如何使用 PHP 会话临时在服务器上存储某些数据。

什么是会话

虽然你可以使用 Cookie 存储数据,但它存在一些安全问题。由于 cookie 存储在用户的计算机上,因此攻击者可以轻松修改 cookie 内容,从而在应用程序中插入可能会破坏应用程序的潜在有害数据。

此外,每次浏览器向服务器请求 URL 时,网站的所有 cookie 数据都会自动发送到请求中的服务器。这意味着如果你在用户系统上存储了 5 个 cookie,每个 cookie 的大小为 4KB,则每次用户查看页面时,浏览器都需要上传 20KB 的数据,这可能会影响你网站的性能。

你可以使用 PHP 会话解决这两个问题。PHP 会话将数据存储在服务器而不是用户的计算机上。在基于会话的环境中,通过称为会话标识符或 SID 的唯一编号来标识每个用户。此唯一会话 ID 用于将每个用户与他们自己在服务器上的信息(如电子邮件,帖子等)相关联。

提示: 会话 ID 由 PHP 引擎随机生成,几乎无法猜测。此外,由于会话数据存储在服务器上,因此不必随每个浏览器请求一起发送。

启动 PHP 会话

在将任何信息存储在会话变量中之前,必须先启动会话。要开始一个新会话,只需调用 PHP session_start() 函数即可。它将创建一个新会话并为用户生成唯一的会话 ID。

以下示例中的 PHP 代码只是启动一个新会话。

<?php
// Starting session
session_start();
?>

session_start() 函数首先通过查找会话 ID 的存在来检查会话是否已存在。如果找到一个,即如果会话已经启动,则会设置会话变量,如果没有,则通过创建新的会话 ID 来启动新会话。

注意: 你必须在页面开头调用 session_start() 函数,即在脚本在浏览器中生成的任何输出之前,就像你在设置 setcookie() 功能性 cookie 时一样。

存储和访问会话数据

你可以将所有会话数据存储为 $_SESSION[] 超全局数组中的键值对。可以在会话的生命周期内访问存储的数据。请考虑以下脚本,该脚本创建新会话并注册两个会话变量。

<?php
// Starting session
session_start();
 
// Storing session data
$_SESSION["firstname"] = "Peter";
$_SESSION["lastname"] = "Parker";
?>

要访问我们在前一个示例中从同一 Web 域上的任何其他页面设置的会话数据 - 只需通过调用重新创建会话 session_start() ,然后将相应的密钥传递给 $_SESSION 关联数组。

<?php
// Starting session
session_start();
 
// Accessing session data
echo 'Hi, ' . $_SESSION["firstname"] . ' ' . $_SESSION["lastname"];
?>

上例中的 PHP 代码生成以下输出。

Hi, Peter Parker

注意: 要在同一页面中访问会话数据,不需要重新创建会话,因为它已经在页面顶部启动。

删除会话

如果要删除某些会话数据,只需取消设置 $_SESSION 关联数组的相应键,如下例所示:

<?php
// Starting session
session_start();
 
// Removing session data
if(isset($_SESSION["lastname"])){
    unset($_SESSION["lastname"]);
}
?>

但是,要完全删除会话,只需调用 session_destroy() 函数即可。此函数不需要任何参数,单个调用会破坏所有会话数据。

<?php
// Starting session
session_start();
 
// Destroying session
session_destroy();
?>

注意: 在使用 session_destroy() 函数删除会话之前,如果尚未使用该 session_start() 函数,则需要首先重新创建会话环境,以便有一些东西可以销毁。

每个 PHP 会话都有一个超时值 - 一个以秒为单位的持续时间 - 它决定了在没有任何用户活动的情况下会话应该保持活动的时间。你可以通过更改 session.gc_maxlifetime PHP 配置文件(php.ini)中的变量值来调整此超时持续时间。