Php 警告:会话_destroy():尝试销毁未初始化的会话

Php 警告:会话_destroy():尝试销毁未初始化的会话,php,session,Php,Session,我的class.inc文件: <?php class logout{ public function logout(){ $_SESSION = array(); if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000

我的class.inc文件:

<?php
class logout{
    public function logout(){
        $_SESSION = array();
        if (ini_get("session.use_cookies")) {
            $params = session_get_cookie_params();
            setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params["httponly"]);
        }
        session_destroy();
    }   
}

?>
当调用
注销
功能时,它会销毁会话,但会显示警告:

Warning: session_destroy(): Trying to destroy uninitialized session in class.inc on line 9
我无法排除故障,因为在
class.inc的
session\u destroy()
启动您的会话

会话_start()并且您可以销毁会话

    <?php
    session_start();
    class logout{
        public function logout(){
            $_SESSION = array();
            if (ini_get("session.use_cookies")) {
                $params = session_get_cookie_params();
                setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params["httponly"]);
            }
            session_destroy();
        }   
    }

?>

如果您事先没有启动会话,则此错误很常见

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

您必须在logout类中的logout函数顶部调用下面提到的函数

session_start();

添加上面的函数并试用。如果您没有在文件顶部启动会话,它将抛出异常,如“头已发送”、“无法启动会话”等。

在调用会话之前,您必须调用会话启动()


您是否将会话存储在文件或数据库中的数据中。如果您将其存储在数据库中,我通常只从会话表中删除与会话id对应的记录,这样您就不必注销每个会话变量,它实际上会删除整个会话

当我开始使用
session\u write\u close()
时,遇到了
session\u destroy()
错误消息。要确定是否应调用
会话\u destroy()
,我必须执行以下操作:

class Session {
    public static function start() {
        self::$haveSession = true;
        session_start();
    }
    public static function finish() {
        session_write_close();
        self::$haveSession = false;
    }
    public static function clear() {
        if (self::$haveSession) {
            session_unset();
            session_destroy();
        }
    }
}

在PHP>=5.4中,可以用
if(session\u status()===PHP\u session\u ACTIVE)
替换
if(self:$haveSession)
,如果之前没有启动会话,可以添加此代码来启动会话

if(!session_id()) {
    session_start();
}


您在哪里启动会话?当没有启动任何会话时,会出现此错误警告。我在
之后的每个页面顶部启动会话,也在您的注销页面?@TobiasKun我的注销仅在同一页面上。它位于每个页面中包含的head.inc文件中。从
@session_destroy()中删除
@
它将显示警告。这不是正确的人。它显示了另一个通知
通知:一个会话已经启动-忽略class.inc第2行的session_start(),因为该文件包含在
session_start()之后的每个文件中。所以两个
session_start()将显示一个通知。虽然我在会话已启动的页面中包含类文件。。。我必须在使用会话的每个类中使用
session\u start()
。否则它会抛出错误。@Jonathan如果(!session_id())session_start(),您可以尝试

if(!session_id()) {
    session_start();
}
if (session_status() === PHP_SESSION_ACTIVE)
        session_destroy();