【问题标题】:Why does a php page refresh release session variable为什么一个php页面刷新释放会话变量
【发布时间】:2015-04-13 22:33:43
【问题描述】:

我试图在 2 分钟后通过unsetsession.php 释放/取消设置会话变量:

<?php

    session_start();

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 120)) {
    // last request was more than 2 minutes ago
    unset($_SESSION['logged_in']);     // unset $_SESSION variable for the run-time
    unset($_SESSION['LAST_ACTIVITY']);
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

?>

会话变量在哪里:

$_SESSION['logged_in'] = 1;
$_SESSION['LAST_ACTIVITY'] = time();

但是,会话变量不会取消设置,而是在我刷新页面时取消设置。该页面正在调用文件 unsetsession.php。为什么会话在 2 分钟后仍未取消设置?

EDIT:页面file.php 在页面顶部有&lt;?php include("includes/unsetsession.php") ?&gt;。在浏览器上刷新file.php 时,会话变量$_SESSION['logged_in'] = 1; 的值变为0。2 分钟后不会改变。只有在页面刷新时才变为0。

我通过在浏览器上运行 getsession.php 来检查值,即:

<?php
  session_start();
  if(isset($_SESSION['logged_in']))
  echo "1";
  else
    echo "0";
?>

【问题讨论】:

  • 他们没有错。 - 运算符的优先级高于 &gt;,所以没关系
  • @developerwjk 它确实对我造成了破坏。我在页面中以&lt;?php include("includes/unsetsession.php") ?&gt; 调用了unsetsession.php。此外,该值不会在 2 分钟到期后重置。有什么指点吗?
  • “当我刷新页面时它们没有被取消设置但被取消设置”是什么意思?如果您刷新页面并且刷新是在设置变量两分钟后进行的,则它们应该被取消设置。编辑:当您的页面加载时,您的 php 脚本只会被调用一次。这就是为什么它只会在你刷新它时破坏变量:如果你不刷新它就不会运行脚本
  • @developerwjk 取消设置会话的代码 - 上面在 qestion 中发布的代码
  • @Angivare 上面的代码来自unsetsession.php。会话变量不会在 2 分钟后取消设置。但是,每当我刷新页面时,该值都是未设置的

标签: javascript php session session-variables session-timeout


【解决方案1】:

好吧,您显然在理解 php 的工作原理方面存在问题。 每当您加载您的页面时,您的 php 脚本将被执行一次

所以你第一次浏览你的代码,你的会话变量就设置好了。 而现在,它结束了。你的 php 脚本已经执行,它刚刚完成,它不会再做任何事情了。

但是如果你刷新你的页面,脚本会被再次调用。 那个时候,会话变量已经设置好了,假设已经两分钟了。所以你进入状态并摧毁它。您对脚本的第二次调用已完成。


因此,在您向我们提供有关您想要实现的目标的更多信息之前,目前还没有真正找到解决问题的方法。

例如,一些解决方案会使用 javascript 定期向 unsetsession.php 发出 AJAX 请求,或者简单地让它保持原样:在加载页面之前不会取消设置会话。这不是一个真正的问题,大多数网站都是这样做的。

【讨论】:

  • 所以你的意思是没有办法让会话过期,比如说对于在网站上闲置一段时间的用户?另外,当我们在网站上的其他位置导航时,为什么会话会在间隔值 2 和/或之前过期?
  • 会话在空闲时不会过期,但在空闲后浏览页面时(但您必须将 unsetsession.php 包含到您网站的每个页面中) )。这或多或少是一回事。可以这样想:你在页面上。您等待 2 分钟,没有任何反应。但是,如果您尝试进入另一个页面,您将被断开连接。现在,您可以按照我的回答中所述使用 AJAX,以便在空闲时 断开连接。
  • @Sarah 如果变量在 2 分钟前到期,即使在重新加载时,您也需要在问题中说明这一点。另外如前所述,您可以使用 AJAX 调用 PHP 文件,例如,您可以有一个 setTimeout() 可以调用取消设置会话的 PHP。
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 2015-07-02
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
相关资源
最近更新 更多