PHP 会话
在整个网站的各个页面之间使数据可访问的另一种方法是使用PHP会话。
会话在服务器上的临时目录中创建一个文件,其中存储了注册的会话变量及其值。在访问期间,该数据将对站点上的所有页面都可用。
临时文件的位置由php.ini文件中的一个设置决定,该设置称为session.save_path。在使用任何会话变量之前,请确保您已经设置了此路径。
开始会话后,以下事情发生:
- PHP首先为该特定会话创建一个唯一标识符,该标识符是一个由32个十六进制数字组成的随机字符串,例如3c7foj34c3jj973hjkop2fc937e3443。
-
自动向用户的计算机发送一个名为 PHPSESSID 的cookie,以存储唯一的会话标识字符串。
-
在指定的临时目录上自动创建一个文件,并带有sess_前缀的唯一标识符的名称,即sess_3c7foj34c3jj973hjkop2fc937e3443。
当PHP脚本想要从会话变量中检索值时,PHP会自动从PHPSESSID cookie中获取唯一的会话标识符字符串,然后在其临时目录中查找带有该名称的文件,并且可以通过比较这两个值来进行验证。
当用户关闭浏览器或离开网站后,会话结束,服务器将在预定的一段时间后终止会话,通常为30分钟。
开始PHP会话
通过调用session_start()函数,可以轻松开始PHP会话。此函数首先检查会话是否已经启动,如果没有启动,则启动一个。建议将session_start()的调用放在页面的开头。
会话变量存储在名为 $_SESSION [] 的关联数组中。这些变量可以在会话的生命周期内访问。
以下示例开始了一个会话,然后注册了一个名为 counter 的变量,每次在会话期间访问页面时,该变量都会递增。
使用 isset() 函数来检查会话变量是否已经设置。
将此代码放入一个test.php文件中,多次加载此文件以查看结果-
<?php
session_start();
if( isset( _SESSION['counter'] ) ) {_SESSION['counter'] += 1;
}else {
_SESSION['counter'] = 1;
}msg = "You have visited this page ". _SESSION['counter'];msg .= "in this session.";
?>
<html>
<head>
<title>Setting up a PHP session</title>
</head>
<body>
<?php echo ( $msg ); ?>
</body>
</html>
它将产生以下结果 –
You have visited this page 1in this session.
销毁PHP会话
通过 session_destroy() 函数可以销毁PHP会话。这个函数不需要任何参数,一个单独的调用就可以销毁所有的会话变量。如果你想销毁一个单独的会话变量,你可以使用 unset() 函数来取消设置一个会话变量。
以下是取消设置一个单独变量的示例:
<?php
unset($_SESSION['counter']);
?>
这是一个会销毁所有会话变量的调用:
<?php
session_destroy();
?>
开启自动会话
如果你可以在php.ini文件中将 session.auto_start 变量设置为1,那么当用户访问你的网站时,你不需要调用start_session()函数来启动会话。
没有cookie的会话
可能有一种情况,用户不允许在他们的设备上存储cookie。因此,有另一种方法将会话ID发送到浏览器。
另外,你可以使用常量SID,如果会话已启动,则会定义该常量。如果客户端没有发送适当的会话cookie,则其形式为session_name=session_id。否则,它扩展为空字符串。因此,你可以无条件地将它嵌入到URL中。
以下示例演示了如何注册一个变量,并使用SID正确链接到另一个页面。
<?php
session_start();
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?<?php echo htmlspecialchars(SID); ?>">
</p>
这将会产生以下的结果 −
You have visited this page 1in this session.
To continue click following link
htmlspecialchars()可以用于打印SID,以防止XSS相关攻击。