Yii - 会话(Session)

  • 简述

    会话使数据可以跨多个页面访问。会话在存储所有会话变量的临时目录中在服务器上创建一个文件。在该特定用户访问期间,该数据可用于您网站的所有页面。
    当会话开始时,会发生以下情况 -
    • PHP 为该特定会话创建一个唯一 ID。
    • 一个名为 PHPSESSID 的 cookie 在客户端(到浏览器)发送。
    • 服务器在保存所有会话变量的临时文件夹中创建一个文件。
    • 当服务器想要从会话变量中检索值时,PHP 会自动从 PHPSESSID cookie 中获取唯一的会话 ID。然后,它在其临时目录中查找所需的文件。
    要启动会话,您应该调用session_start()函数。所有会话变量都存储在$_SESSION全局变量中。您还可以使用isset()函数来检查会话变量是否已设置 -
    
    <?php
       session_start();
       if( isset( $_SESSION['number'] ) ) {
          $_SESSION['number'] += 1;
       }else {
          $_SESSION['number'] = 1;
       }
       $msg = "This page was visited ".  $_SESSION['number'];
       $msg .= "in this session.";
       echo $msg;
    ?>
    
    要销毁会话,您应该调用session_destroy()函数。要销毁单个会话变量,请调用unset()函数 -
    
    <?php
       unset($_SESSION['number']);
       session_destroy();
    ?>
    
  • 在 Yii 中使用会话

    会话允许数据在用户请求中被持久化。在 PHP 中,您可以通过$_SESSION变量访问它们。在 Yii 中,您可以通过会话应用程序组件访问会话。
    第 1 步- 将actionOpenAndCloseSession方法添加到SiteController
    
    public function actionOpenAndCloseSession() {
       $session = Yii::$app->session;
       // open a session
       $session->open();
       // check if a session is already opened
       if ($session->isActive) echo "session is active";
       // close a session
       $session->close();
       // destroys all data registered to a session
       $session->destroy();
    }
    
    在上面的代码中,我们得到了会话应用组件,打开一个会话,检查它是否处于活动状态,关闭会话,最后销毁它。
    第 2 步- 在 Web 浏览器的地址栏中键入http://localhost:8080/index.php?r=site/open-and-close-session,您将看到以下内容。
    会话活动
    要访问会话变量,您可以使用set()get()方法。
    第 3 步- 将actionAccessSession方法添加到SiteController
    
    public function actionAccessSession() {
       $session = Yii::$app->session;
        
       // set a session variable
       $session->set('language', 'ru-RU');
        
       // get a session variable
       $language = $session->get('language');
       var_dump($language);
              
       // remove a session variable
       $session->remove('language');
              
       // check if a session variable exists
       if (!$session->has('language')) echo "language is not set";
              
       $session['captcha'] = [
          'value' => 'aSBS23',
          'lifetime' => 7200,
       ];
       var_dump($session['captcha']);
    }
    
    第 4 步- 转到http://localhost:8080/index.php?r=site/access-session,您将看到以下内容。
    行动会议