PHP 基础教程
PHP 高级教程
PHP & MySQL DATABASE
PHP 示例
PHP 参考手册

PHP Sessions

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

什么是会话

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

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

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

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

启动 PHP 会话

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

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

示例

Download
<?php
// 开始会话
session_start();
?>

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

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


存储和访问会话数据

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

示例

Download
<?php
// 开始会话
session_start();
 
// 保存会话数据
$_SESSION["firstname"] = "Peter";
$_SESSION["lastname"] = "Parker";
?>

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

示例

Download
<?php
// 开始会话
session_start();
 
// 访问会话数据
echo 'Hi, ' . $_SESSION["firstname"] . ' ' . $_SESSION["lastname"];
?>

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

Hi, Peter Parker

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


销毁会话

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

示例

Download
<?php
// 开始会话
session_start();
 
// 删除会话数据
if(isset($_SESSION["lastname"])){
    unset($_SESSION["lastname"]);
}
?>

但是,要完全销毁会话,只需调用 session_destroy() 函数。 此函数不需要任何参数,一次调用会破坏所有会话数据。

示例

Download
<?php
// 开始会话
session_start();
 
// 销毁会话
session_destroy();
?>

注意: 在使用 session_destroy() 函数销毁会话之前,您需要先使用 session_start() 函数重新创建会话环境(如果它不存在),以便有一些东西要销毁。

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

Advertisements