【问题标题】:PHP sessions that have already been started [duplicate]已经开始的PHP会话[重复]
【发布时间】:2012-05-25 19:30:26
【问题描述】:

在我的 PHP 代码中,如果一个会话已经开始,并且我尝试开始一个新的会话,我会收到以下通知:

注意:会话已经开始 - 忽略 session_start()

我怎样才能避免这种情况?

【问题讨论】:

  • 如果旧会话正在运行,是否不启动新会话?
  • How to tell if a session is active? 的可能重复项 - 请在提问前使用搜索。
  • 对我来说,它只是通过删除 session_start() 来工作,如果会话已经开始,那么为什么我们需要再次启动它。在我的情况下,它只是一个包含在代码中的 config.php 文件
  • 我已将session_start() 放入我的一个包含文件中,并将require_once 它放入我需要的每个文件中。

标签: php session


【解决方案1】:

试试

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    } 
?>

【讨论】:

  • 如果您使用母版页来包装所有内容,这会使实施安全性变得更加容易。
  • 当您可能会或可能不会加载包含 session_start() 的文件时,也建议您这样做,这是很好的标准做法
【解决方案2】:

如果您想要一个新的,请在开始之前执行session_destroy()。 要在启动之前检查它是否已设置,请致电session_status()

$status = session_status();
if($status == PHP_SESSION_NONE){
    //There is no active session
    session_start();
}else
if($status == PHP_SESSION_DISABLED){
    //Sessions are not available
}else
if($status == PHP_SESSION_ACTIVE){
    //Destroy current and start new one
    session_destroy();
    session_start();
}

我会避免检查全局 $_SESSION 而不是 of 我正在调用 session_status() 方法,因为 PHP 将此函数显式实现为:

通过新函数 session_status 公开会话状态 这是为 (PHP >=5.4.0)

【讨论】:

    【解决方案3】:

    仅当您想销毁之前的会话时:

    <?php
        if(!isset($_SESSION)) 
        { 
            session_start(); 
        }
        else
        {
            session_destroy();
            session_start(); 
        }
    ?>
    

    或者你可以使用

    unset($_SESSION['variable_session _data'])
    

    销毁特定的会话变量。

    【讨论】:

      【解决方案4】:
      session_status() === PHP_SESSION_ACTIVE ?: session_start();
      

      封闭游戏

      【讨论】:

        【解决方案5】:

        是的,您可以通过检查isset($_SESSION) 来检测会话是否已在运行。然而,最好的答案就是不要多次致电session_start()

        它应该在你的脚本中很早就被调用,甚至可能是第一行,然后不再被调用。

        如果您的代码中不止一个地方有它,那么您就要求得到这种错误。把它剪下来,让它只在一个地方,并且只能调用一次。

        【讨论】:

          【解决方案6】:

          您必须已经调用了会话开始,可能会通过包含再次调用?

          if( ! $_SESSION)
          {
              session_start();
          }  
          

          【讨论】:

          • 有点晚了,但无论出于何种原因,这都行不通。只有 (!isset($_SESSION)) 有效。
          • 有被解雇的风险:Notice: Undefined variable: _SESSION。请改用isset
          【解决方案7】:

          我在尝试修复 $_SESSION 的阻塞行为时遇到了这个问题。

          http://konrness.com/php5/how-to-prevent-blocking-php-requests/

          会话文件保持锁定状态,直到脚本完成或 会话已手动关闭。

          因此,默认情况下,页面应以只读模式打开会话。但是一旦它以只读方式打开,就必须关闭并重新打开才能使其进入写入模式。

          const SESSION_DEFAULT_COOKIE_LIFETIME = 86400;
          
          /**
           * Open _SESSION read-only
           */
          function OpenSessionReadOnly() {
              session_start([
                                'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME,
                                'read_and_close'  => true,    // READ ACCESS FAST
                            ]);
              // $_SESSION is now defined. Call WriteSessionValues() to write out values
          }
          
          /**
           * _SESSION is read-only by default. Call this function to save a new value
           * call this function like `WriteSessionValues(["username"=>$login_user]);`
           * to set $_SESSION["username"]
           *
           * @param array $values_assoc_array
           */
          function WriteSessionValues($values_assoc_array) {
              // this is required to close the read-only session and 
              // not get a warning on the next line.
              session_abort();
          
              // now open the session with write access
              session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]);
          
              foreach ($values_assoc_array as $key => $value) {
                  $_SESSION[ $key ] = $value;
              }
              session_write_close();  // Write session data and end session
          
              OpenSessionReadOnly(); // now reopen the session in read-only mode.
          }
          
          OpenSessionReadOnly();  // start the session for this page
          

          那么当你去写一些值时:

          WriteSessionValues(["username"=>$login_user]);
          

          该函数采用一组键=>值对来提高效率。

          【讨论】:

            【解决方案8】:

            只需使用 if 语句

             if(!isset($_SESSION)) 
                 { 
                     session_start(); 
                 }
            

            使用返回当前会话状态的 session_status 检查会话状态 如果当前会话已经在工作,那么如果会话不工作开始会话,则返回没有其他内容

            
            session_status() === PHP_SESSION_ACTIVE ?: session_start();
            

            【讨论】:

              【解决方案9】:

              试试这个

              if(!isset($_SESSION)){ 
                  session_start();
              }
              

              我建议你使用 ob_start();在开始任何 sesson 变量之前,这应该命令您浏览器缓冲区。

              编辑:在 $_SESSION 之后添加了一个额外的 )

              【讨论】:

                【解决方案10】:

                以上都不适合,如果没有在所有依赖于 $Session 变量的 php 文件中调用 session_start(),它们将不会被包含在内。通知太烦人了,很快就填满了Error_log。我能找到的唯一可行的解​​决方案是这个....

                    error_reporting(E_ALL ^ E_NOTICE);
                    session_start();
                

                一个不好的修复,但它有效。

                【讨论】:

                  【解决方案11】:

                  这样会更有效率:

                  @session_start();
                  

                  避免屏幕中的错误处理程序

                  最好的,

                  【讨论】:

                    【解决方案12】:
                    <?php
                    if ( session_id() != "" ) {
                        session_start();
                    }
                    

                    基本上,您需要在创建另一个会话之前检查一个会话是否已启动; ... more reading.

                    另一方面,您选择在使用session_destroy() 创建另一个会话之前销毁现有会话。

                    【讨论】:

                      猜你喜欢
                      • 2019-09-16
                      • 2018-12-25
                      • 2012-11-25
                      • 2023-03-23
                      • 1970-01-01
                      • 2011-09-09
                      相关资源
                      最近更新 更多