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