在整个网站的各个页面上使数据都可访问的另一种方法是使用PHP会话。
会话将在服务器上的临时目录中创建一个文件,在该目录中存储已注册的会话变量及其值。 该数据将在访问期间提供给网站上的所有页面。
临时文件的位置由php.ini
文件中名为session.save_path
的字符项设置决定。在使用会话变量之前,确保已经设置了这个路径。
当事件发生后开始会话 -
- PHP首先为该特定会话创建一个唯一标识符,该标识符是
32
个十六进制数字的随机字符串,例如:jb28hvh1binl3gpdgfl570k2e1
。 - 一个名为
PHPSESSID
的cookie会自动发送到用户的计算机来存储唯一的会话标识字符串。 - 在指定的临时目录中的服务器上自动创建一个文件,并在文件名前加上前缀为
sess_sess_jb28hvh1binl3gpdgfl570k2e1
的唯一标识符。
当PHP脚本想要从会话变量中检索值时,PHP会自动从PHPSESSID cookie中获取唯一的会话标识符字符串,然后在其临时目录中查找带有该名称的文件,并通过比较这两个值来进行验证。
当用户丢失浏览器或离开站点后,会话结束,服务器将在预定的时间段(通常为30分钟的持续时间)之后终止会话。
开始一个PHP会话
一个PHP会话是通过调用session_start()
函数来启动的。该函数首先检查一个会话是否已经启动,如果没有启动则启动一个会话。 建议将调用session_start()
放在页面的开头。
会话变量存储在名为$_SESSION []
的关联数组中。这些变量可以在会话的生命期间被访问。
以下示例将启动一个会话,然后注册一个名为counter
的变量,在会话期间每次访问页面时都会增加该变量的值。
使用isset()
函数检查会话变量是否已经设置。
把这段代码放到一个session.php
文件中,并多次加载执行这个文件来查看结果 -
<?php
session_start();
if( !isset( $_SESSION['username'] ) ) {
$_SESSION['username'] = 'Maxsu';
}
if( isset( $_SESSION['counter'] ) ) {
$_SESSION['counter'] += 1;
}else {
$_SESSION['counter'] = 1;
}
$msg = "您好,".$_SESSION['username']." ! 当前您已经第 ". $_SESSION['counter'];
$msg .= " 次访问这个页面了。";
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8" />
<title>设置Session示例</title>
</head>
<body>
<?php echo ( $msg ); ?>
</body>
</html>
将上面示例代码保存到文件:index.php 中,执行得到以下结果 -
销毁一个PHP会话
一个PHP会话可以调用session_destroy()
函数来销毁。 这个函数不需要任何参数,一个调用就可以销毁所有的会话变量。 如果想销毁一个会话变量,那么可以使用unset()
函数来销毁一个会话变量。
这里是一个例子来销毁单个变量 -
<?php
unset($_SESSION['counter']);
?>
下面是一个会销毁所有会话变量的调用 -
<?php
session_destroy();
?>
打开自动会话
如果可以在php.ini
文件中将session.auto_start
变量设置为1
,则不需要在用户访问网站时调用start_session()
函数启动会话。
不使用cookies的会话
可能会出现这种情况,当用户不允许在他们的机器上存储cookies时。另一种方法发送会话ID给浏览器。
或者,可以使用会话开始时定义的常量SID
。 如果客户端没有发送适当的会话cookie,则其格式为session_name = session_id
。 否则,它将扩展为空字符串。 因此,可以无条件地将其嵌入到URL中。
以下示例演示如何注册一个变量,以及如何使用SID正确链接到另一个页面。
<?php
session_start();
define('SID', session_id());
if (isset($_SESSION['counter'])) {
$_SESSION['counter'] = 1;
}else {
$_SESSION['counter']++;
}
$msg = "You have visited this page ". $_SESSION['counter'];
$msg .= " in this session.";
echo ( $msg );
?>
<p>
To continue click following link <br />
<a href = "nextpage.php?sid=<?php echo htmlspecialchars(SID); ?>">Next Page</a>
</p>
打印SID
时可能使用htmlspecialchars()
,以防止XSS相关的攻击。