PHP会话


在整个网站的各个页面上使数据可访问的另一种方法是使用PHP会话。

会话在服务器上的临时目录中创建一个文件,其中存储了注册的会话变量及其值。该数据将在访问期间提供给网站上的所有页面。

临时文件的位置由名为 session.save_pathphp.ini 文件中的设置决定。在使用任何会话变量之前,请确保您已设置此路径。 **

当事情发生后开始会话 -

  • PHP首先为该特定会话创建一个唯一标识符,该标识符是32个十六进制数字的随机字符串,例如3c7foj34c3jj973hjkop2fc937e3443。

  • 名为 PHPSESSID 的cookie 会自动发送到用户的计算机以存储唯一的会话标识字符串。

  • 在指定的临时目录中的服务器上自动创建一个文件,并在名称前面加上前缀为sess_sess_3c7foj34c3jj973hjkop2fc937e3443的唯一标识符。

当PHP脚本想要从会话变量中检索值时,PHP会自动从PHPSESSID cookie中获取唯一的会话标识符字符串,然后在其临时目录中查找带有该名称的文件,并通过比较这两个值来完成验证。

会话在用户丢失浏览器或离开站点后结束,服务器将在预定的时间段(通常为30分钟的持续时间)后终止会话。

开始一个PHP会话

一个PHP会话很容易通过调用 session_start() 函数来启动。该函数首先检查会话是否已经启动,如果没有启动则启动一个会话。建议将呼叫发送到页面的开始处的 session_start()

会话变量存储在名为 $ _SESSION []的 关联数组中。这些变量可以在会话的生命周期中访问。

以下示例将启动一个会话,然后注册一个称为 计数器 的变量,每次在会话期间访问页面时都会增加该变量。

使用 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会话

一个PHP会话可以被 session_destroy() 函数销毁。这个函数不需要任何参数,一次调用就可以销毁所有的会话变量。如果要销毁单个会话变量,则可以使用 unset() 函数来取消设置会话变量。

这里是取消设置单个变量的示例 -

<?php
   unset($_SESSION['counter']);
?>

这是一个会破坏所有会话变量的调用 -

<?php
   session_destroy();
?>

打开自动会话

如果您可以在 php.ini 文件中将 session.auto_start 变量设置为1,则不需要调用start_session()函数在用户访问您的站点时启动会话。 **

没有cookies的会话

用户不允许在他们的机器上存储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() 可以为了防止XSS相关的攻击打印SID时使用。