PHP/Session/Caching-处理logout.PHP后无法从index.PHP页面删除登录用户?

PHP/Session/Caching-处理logout.PHP后无法从index.PHP页面删除登录用户?,php,session,Php,Session,我有三个PHP脚本(logout.PHP、index.PHP、session.PHP),可以在更大的应用程序中使用。我合并了session.php(作为一种机制来控制保留页面视图,以便在浏览器上按下后退按钮) 我正在尝试清除logout.php缓存和网页上登录的用户信息,但无论我做什么,我似乎都无法注销。也就是说,用户登录时仍保留在我的页面上 如何注销以确保用户不会在我的index.php页面上显示为已登录 session.php <? session_cache_limiter('

我有三个PHP脚本(logout.PHP、index.PHP、session.PHP),可以在更大的应用程序中使用。我合并了session.php(作为一种机制来控制保留页面视图,以便在浏览器上按下后退按钮)

我正在尝试清除logout.php缓存和网页上登录的用户信息,但无论我做什么,我似乎都无法注销。也就是说,用户登录时仍保留在我的页面上

如何注销以确保用户不会在我的index.php页面上显示为已登录

session.php

<? 
  session_cache_limiter('public');
  session_start();
?>
<?php
    session_start();
    $_SESSION['expire'] = "<META HTTP-EQUIV=\"EXPIRES\" CONTENT=\"Mon, 02 May 2015 21:00:00 GMT\">";
    header('Location: index.php');                                             
?>
<?php
    if (isset($_SESSION['expire']))
    {      
        session_start();        
        echo $_SESSION['expire'];
        session_destroy();
    } 
    else
    {
        require_once('session.php');
    }
?>
 <!DOCTYPE html>
    <?php
        session_start();
        if (session_status() === PHP_SESSION_NONE)
        {
            require_once('session.php');
        }
        else if (isset($_SESSION['expire']))
        { 
            $expire = $_SESSION['expire'];
            session_destroy();
            echo $expire;
            echo "<meta http-equiv='refresh' content='0; url=index.php'>";
        } 
    ?>
    <html>
    ... rest of code not shown
<?php 
  session_start();
  session_cache_limiter('public');
?>
<?php
    session_start();
    $_SESSION['expire'] = "<META HTTP-EQUIV=\"EXPIRES\" CONTENT=\"Mon, 02 May 2015 21:00:00 GMT\">";
    header('Location: index.php');                                             
?>

logout.php

<? 
  session_cache_limiter('public');
  session_start();
?>
<?php
    session_start();
    $_SESSION['expire'] = "<META HTTP-EQUIV=\"EXPIRES\" CONTENT=\"Mon, 02 May 2015 21:00:00 GMT\">";
    header('Location: index.php');                                             
?>
<?php
    if (isset($_SESSION['expire']))
    {      
        session_start();        
        echo $_SESSION['expire'];
        session_destroy();
    } 
    else
    {
        require_once('session.php');
    }
?>
 <!DOCTYPE html>
    <?php
        session_start();
        if (session_status() === PHP_SESSION_NONE)
        {
            require_once('session.php');
        }
        else if (isset($_SESSION['expire']))
        { 
            $expire = $_SESSION['expire'];
            session_destroy();
            echo $expire;
            echo "<meta http-equiv='refresh' content='0; url=index.php'>";
        } 
    ?>
    <html>
    ... rest of code not shown
<?php 
  session_start();
  session_cache_limiter('public');
?>
<?php
    session_start();
    $_SESSION['expire'] = "<META HTTP-EQUIV=\"EXPIRES\" CONTENT=\"Mon, 02 May 2015 21:00:00 GMT\">";
    header('Location: index.php');                                             
?>

index.php脚本的开头

<?php   
    session_start(); 
    if (isset($_SESSION['expire']))
    {              
        echo $_SESSION['expire'];
        session_unset();
        session_destroy();
        unset($_SESSION);
    } 
?>
<?php
    if (session_status() === PHP_SESSION_NONE)
    {
        require_once('session.php');
    }
    else
    {
        session_start();  
        if (isset($_SESSION['expire']))
        { 
            $expire = $_SESSION['expire'];
            session_destroy();
            echo $expire;
        }
    }
?>

每次尝试注销时,错误日志都会显示以下内容

PHP注意:会话已经启动-忽略index.PHP第6行中的会话_start()
我为我的脚本制定了以下代码,解决了我遇到的注销问题。我将问题的原因缩小到可能错误地解释/解析浏览器中的html代码,我注意到在我的页面源代码中有红色标记

在php脚本的
标记之前添加doctype和doctype之后的元标记后,我成功地注销了我的页面

index.php

<? 
  session_cache_limiter('public');
  session_start();
?>
<?php
    session_start();
    $_SESSION['expire'] = "<META HTTP-EQUIV=\"EXPIRES\" CONTENT=\"Mon, 02 May 2015 21:00:00 GMT\">";
    header('Location: index.php');                                             
?>
<?php
    if (isset($_SESSION['expire']))
    {      
        session_start();        
        echo $_SESSION['expire'];
        session_destroy();
    } 
    else
    {
        require_once('session.php');
    }
?>
 <!DOCTYPE html>
    <?php
        session_start();
        if (session_status() === PHP_SESSION_NONE)
        {
            require_once('session.php');
        }
        else if (isset($_SESSION['expire']))
        { 
            $expire = $_SESSION['expire'];
            session_destroy();
            echo $expire;
            echo "<meta http-equiv='refresh' content='0; url=index.php'>";
        } 
    ?>
    <html>
    ... rest of code not shown
<?php 
  session_start();
  session_cache_limiter('public');
?>
<?php
    session_start();
    $_SESSION['expire'] = "<META HTTP-EQUIV=\"EXPIRES\" CONTENT=\"Mon, 02 May 2015 21:00:00 GMT\">";
    header('Location: index.php');                                             
?>


我为我的脚本制定了下面的代码,解决了我遇到的注销问题。我将问题的原因缩小到可能错误地解释/解析浏览器中的html代码,我注意到在我的页面源代码中有红色标记

在php脚本的
标记之前添加doctype和doctype之后的元标记后,我成功地注销了我的页面

index.php

<? 
  session_cache_limiter('public');
  session_start();
?>
<?php
    session_start();
    $_SESSION['expire'] = "<META HTTP-EQUIV=\"EXPIRES\" CONTENT=\"Mon, 02 May 2015 21:00:00 GMT\">";
    header('Location: index.php');                                             
?>
<?php
    if (isset($_SESSION['expire']))
    {      
        session_start();        
        echo $_SESSION['expire'];
        session_destroy();
    } 
    else
    {
        require_once('session.php');
    }
?>
 <!DOCTYPE html>
    <?php
        session_start();
        if (session_status() === PHP_SESSION_NONE)
        {
            require_once('session.php');
        }
        else if (isset($_SESSION['expire']))
        { 
            $expire = $_SESSION['expire'];
            session_destroy();
            echo $expire;
            echo "<meta http-equiv='refresh' content='0; url=index.php'>";
        } 
    ?>
    <html>
    ... rest of code not shown
<?php 
  session_start();
  session_cache_limiter('public');
?>
<?php
    session_start();
    $_SESSION['expire'] = "<META HTTP-EQUIV=\"EXPIRES\" CONTENT=\"Mon, 02 May 2015 21:00:00 GMT\">";
    header('Location: index.php');                                             
?>


请注意,当我添加回常规标记时,您使用的是短标记
,当我在重定向到index.php之前死亡()时,我的浏览器仍在重定向到index.php。我感到困惑的是为什么在我加上die()之后;脚本仍然重定向到index.php。我尝试了ini_集合和错误报告,但没有看到任何错误。我可能是错的,但这里的问题很可能是在销毁会话之前的回声。我可能会补充说,
session\u destroy
就足够了,您根本不需要调用
session\u unset
,请不要执行
unset($\u session)
,只是不要执行。@ggg,我正在尝试回显meta标记以尝试删除任何缓存的信息。你建议在会话_destroy()之前不要回显吗?@MichaelBerkowski,我编辑了代码,使会话_start()正确地放置在我的if块中。我一开始是不正确的。php错误日志中没有错误,只是当我转到logout.php时,用户仍然存在。注意,当我添加回常规标记时,您使用的是短标记
,当我重定向到index.php之前死亡()时,我的浏览器仍然重定向到index.php。我感到困惑的是为什么在我加上die()之后;脚本仍然重定向到index.php。我尝试了ini_集合和错误报告,但没有看到任何错误。我可能是错的,但这里的问题很可能是在销毁会话之前的回声。我可能会补充说,
session\u destroy
就足够了,您根本不需要调用
session\u unset
,请不要执行
unset($\u session)
,只是不要执行。@ggg,我正在尝试回显meta标记以尝试删除任何缓存的信息。你建议在会话_destroy()之前不要回显吗?@MichaelBerkowski,我编辑了代码,使会话_start()正确地放置在我的if块中。我一开始是不正确的。php错误日志中没有错误,只是当我转到logout.php时用户仍然存在。仍然不确定为什么我需要按logout两次,但我临时得到了一个接近我需要的解决方案。我将进一步调查这个问题,看看为什么我仍然需要按两次注销。您不能将
声明放在PHP代码之前。对
会话\u start()
的调用将在那里失败,因为您已经发送了输出。在打开
之前是否已经有缩进的空格?例如,可能不是注销实际上已经成功完成,而是因为
会话启动()
由于doctype的位置,调用失败。我确实按照建议将doctype向下移动到下面的php代码,当我尝试访问一个仅限于登录用户的页面时,我无法访问该页面,我被迫使用适当的凭据再次登录。我希望这能解决这个问题。但我仍然不确定为什么我必须双击注销。仍然不确定为什么我需要按两次注销,但我暂时得到了一个接近我需要的解决方案。我将进一步调查这个问题,看看为什么我仍然需要按两次注销。您不能将
声明放在PHP代码之前。对
会话\u start()
的调用将在那里失败,因为您已经发送了输出。在打开
之前是否已经有缩进的空格?例如,可能不是注销实际上已经成功完成,而是因为
会话启动()
由于doctype的位置,调用失败。我确实按照建议将doctype向下移动到下面的php代码,当我尝试访问一个仅限于登录用户的页面时,我无法访问该页面,我被迫使用适当的凭据再次登录。我希望这能解决这个问题。但我仍然不确定为什么我必须双击注销。