PHP:如何检测会话是否自动过期?

PHP:如何检测会话是否自动过期?,php,session,Php,Session,定义会话过期时间后,是否可以在过期时调用事件侦听器 如果不可能,是否可以运行cron作业来检查会话是否已过期 注意:我对服务器解决方案感兴趣。我说的是这样一种情况:定义了一个会话过期时间,并且会话自动结束,因为该时间段已过期。我们可以使用您定义的会话变量 if(isset($_SESSION['variable'])){ //do something } 例如: if(isset($_SESSION['name'])){ echo "Session has not expire

定义会话过期时间后,是否可以在过期时调用事件侦听器

如果不可能,是否可以运行cron作业来检查会话是否已过期


注意:我对服务器解决方案感兴趣。我说的是这样一种情况:定义了一个会话过期时间,并且会话自动结束,因为该时间段已过期。

我们可以使用您定义的会话变量

if(isset($_SESSION['variable'])){
    //do something
}
例如:

if(isset($_SESSION['name'])){
    echo "Session has not expired"; 
}

您可以将连接时间存储在某个位置(表,…),以便查看用户连接后的时间,并进行定期检查(cron或服务),查看日期是否已超过特定的持续时间(5分钟,…)


但是,如果您想警告用户(文档丢失,…),您可能需要在客户端执行一个Javascript
窗口。setTimeout

您要做的是在一段时间间隔内运行一个jQuery AJAX请求,以检查会话是否过期,以及何时过期,您可以将用户发送到注销

Ajax代码 PHP代码

session_start();
$data = $_SESSION["sessionVariable"];
if($data == ''){
    echo "1";
}
else{
    echo "0";
}
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">

    window.setInterval(function(){
      $.ajax({
            url:"check_login.php", //the page containing php script
            type: "post",
            success:function(result){

             if(result==0){
                alert("session out");
                // or redirect url here
             }
           }
         });

    }, 5000);
</script>

听起来您想在服务器端的给定时间清除会话。您需要做的是定义您自己的自定义会话处理程序,并将会话数据放在您完全控制的系统中。假设您将会话处理移动到数据库中。现在,所有会话数据都完全在您的控制范围内。下面是一个缩写

您可以在这里运行自己的清理脚本。现在,我建议您使用一个中间内存存储(memcached、Redis等),这样您就不必每次都从数据库加载。当您运行清理脚本时,您会希望清除这些内容(即,提取所有即将过期的会话并从缓存中删除)。但是这里有一个简单的SQL语句(例如,在5分钟的cron作业上运行)可以根据需要清除会话

 DELETE FROM your_session_table
 WHERE expires < now();
从您的会话表中删除
WHERE expires
在一页上设置初始会话

示例:
Login.php

<?php
session_start();
if(...){
   // success
   $_SESSION['logged_time'] = time();
}
?>
<?php
   session_start();
   $login_session_duration = 60; // 1 minute 

   if($_SESSION['logged_time']){
      if(((time() - $_SESSION['logged_time']) > $login_session_duration)){ 
         echo 'session expired';
         // session will be exired after 1 minutes
      }else{
         echo 'session alive';
      }
   }
?>

每次向服务器发送http请求时,请检查会话过期时间。若会话有效,那个么做你们的事情,其他明智的重定向到你们想要的地方

你可以做一件事来节省时间。创建一个检查当前会话有效性的方法,并在http请求中调用它

您也可以使用以下命令:)


我在这里做一些假设

我假设,无论出于何种原因,您都希望能够跟踪过期的会话cold,也就是说,不需要通过数据库或第二个“隐藏”会话来补充跟踪会话数据,该会话充当确定伪会话何时过期并正确操作的结构

我还假设您会话中的黑客尝试在这一点上并不重要。中间人攻击和XSS攻击可以捕获会话ID并将其插入您的系统,这将很难检测到

默认情况下,这类事情由php中的会话cookie处理。我还假设您的会话标识和会话启动也由cookie处理

几乎没有办法做到“实时”,也就是说,保持一个套接字对服务器开放,以便在会话到期时检测。PHP不是设计成这样工作的;安全问题是广泛的。同样,如果您允许某人通过安全通道远程访问您的服务器,那么您首先为什么要处理会话呢

$sessionCookie = 'myPHPSessCookieName';
$isSessionExpired = false;

if (isset($_COOKIE[$sessionCookie])) {
  // check cookie expiry time to show warnings / near expiry behaviours
} else {
  // handle missing cookie / session
  $isSessionExpired = true;
}

define('SESSION_EXPIRED', $isSessionExpired);    
session_start(['name' => $sessionCookie]);
必须在开始会话之前检查cookie,否则您可能会给自己带来误报

[编辑:javascript解决方案]

如果希望生成模拟套接字的行为,javascript可以这样做。客户端浏览器将使用AJAX请求ping服务器,以检查其会话的状态,一旦它检测到会话已过期,您可以选择一种行为。注意:javascript在其当前状态下基本上是不安全的。如果可能的话,所有与数据和安全相关的工作都应该由服务器完成

client.php:

<script>
  $(function(){
    var messageElem = $('#selectorForDisplayElementHere');
    var timeoutID = null;

    var checkSession = function(){
      $
        .ajax({/* your ajax params: url, data, dataType, method etc. */})
        .then(function(response){
          messageElem.html(response.html);
          if (response.stop === 1) { 
            clearTimeout(timeoutID);
          }
        });
    };

    var timeoutID = setInterval(checkSession, 5000); // Every 5 seconds
  });
</script>

$(函数(){
var messageElem=$('selectorForDisplayElementHere');
var timeoutID=null;
var checkSession=函数(){
$
.ajax({/*您的ajax参数:url、数据、数据类型、方法等。*/})
.然后(功能(响应){
html(response.html);
如果(response.stop==1){
clearTimeout(timeoutID);
}
});
};
var timeoutID=setInterval(checkSession,5000);//每5秒
});
ajax.php:

$response = ['html' => '', 'stop' => 0];

if (SESSION_EXPIRED) {
  $response ['html'] = '<b>Your session has expired. Please log in again.</b>';
  $response['stop'] = 1;
}

echo(json_encode($response));
$response=['html'=>'','stop'=>0];
如果(会话已过期){
$response['html']=“您的会话已过期。请重新登录。”;
$response['stop']=1;
}
echo(json_编码($response));
这是一个非常简单的处理系统,可以通过各种功能轻松增强。它使用无处不在的jQuery库和标准php和html/javascript功能

是否可以在事件侦听器过期时调用它

简而言之,答案是否定的

关于会话,人们往往会忽略一些奇怪的事情。使用默认处理程序,会话不会在
gc\u maxlifest
结束时过期-这只是数据符合自动删除条件的时间。会话所有者没有任何操作会触发会话的后续删除-这是其他人会话的副作用

调用
session\u write\u close()
时(通过代码结尾显式或隐式调用),如果由相关gc设置调整的随机数生成器抛出正确的数字,则PHP将查找超过其TTL的数据并将其删除。如果您想在此时触发一个操作,那么您需要中断默认处理程序并应用您自己的处理程序。这意味着您不仅需要提供识别和删除会话的机制
<script>
  $(function(){
    var messageElem = $('#selectorForDisplayElementHere');
    var timeoutID = null;

    var checkSession = function(){
      $
        .ajax({/* your ajax params: url, data, dataType, method etc. */})
        .then(function(response){
          messageElem.html(response.html);
          if (response.stop === 1) { 
            clearTimeout(timeoutID);
          }
        });
    };

    var timeoutID = setInterval(checkSession, 5000); // Every 5 seconds
  });
</script>
$response = ['html' => '', 'stop' => 0];

if (SESSION_EXPIRED) {
  $response ['html'] = '<b>Your session has expired. Please log in again.</b>';
  $response['stop'] = 1;
}

echo(json_encode($response));
$current_time=time();
$maxlifetime = ini_get("session.gc_maxlifetime");
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">

    window.setInterval(function(){
      $.ajax({
            url:"check_login.php", //the page containing php script
            type: "post",
            success:function(result){

             if(result==0){
                alert("session out");
                // or redirect url here
             }
           }
         });

    }, 5000);
</script>
if (session_status() == PHP_SESSION_NONE) {
    session_start();    
}

if(isset($_SESSION["<session_name>"])){
    echo "1";
}
else{
    echo "0";
}