27

我的在线考试管理系统有一个奇怪的问题。

测试表单(test.php)中的一些用户需要很长时间才能回答问题并提交表单。

提交表单后,会话过期,用户必须再次登录

这不是代码问题

我将此值设置在所有页面的顶部

ini_set('session.gc_maxlifetime', 18000);

有没有办法在不以测试表单重新加载页面的情况下刷新会话 evrey 10 分钟以防止会话过期?

请帮我

谢谢

4

2 回答 2

39

您可以使用 javascript XHR,或者其他人称之为 AJAX。

使用 ajax,您可以调用每 10 分钟刷新一次会话的 php 脚本。:)


这是我所能达到的“精确”。

javascript

var refreshSn = function ()
{
    var time = 600000; // 10 mins
    setTimeout(
        function ()
        {
        $.ajax({
           url: 'refresh_session.php',
           cache: false,
           complete: function () {refreshSn();}
        });
    },
    time
);
};

// Call in page
refreshSn()

refresh_session.php

<?php
session_start();

// store session data
if (isset($_SESSION['id']))
$_SESSION['id'] = $_SESSION['id']; // or if you have any algo.
?>

无论如何,另一种解决方案是仅使用此处提供的解决方案来延长测试页面的会话时间

如何在 30 分钟后使 PHP 会话过期?

于 2012-09-26T08:12:35.510 回答
15

你所需要的就是这个(对 $.post 使用 jQuery):

JavaScript(把它放在你的 onload-function 里面)

setInterval(function(){
  $.post('path/to/refresh_session.php');
},600000); //refreshes the session every 10 minutes

refresh_session.php

<?php
  session_start();

  // if you have more session-vars that are needed for login, also check 
  // if they are set and refresh them as well
  if (isset($_SESSION['token'])) { 
    $_SESSION['token'] = $_SESSION['token'];
  }
?>

最大的变化是在 JavaScript 中——你不需要一个完整的函数,只需要一行。


额外信息

虽然我认为只调用session_start()php 就足够了,但如果我没看错的话(http://nl3.php.net/function.session-start):

读取回调将检索任何现有的会话数据(以特殊的序列化格式存储)并将被反序列化并用于在读取回调将保存的会话数据返回给 PHP 会话处理时自动填充 $_SESSION 超全局变量。

在测试期间,我只将上述代码放在我的访问者页面上,而不是放在管理页面上。但是我在同一个浏览器(Chrome)中打开了两个页面,并且管理页面也保持登录状态,至少一个多小时(不再检查)。 但是,我不知道如果你只使用它是否仍然有效session_start(),而根本没有手动刷新任何 session-var..

无论哪种方式,我都希望确保我需要的会话变​​量确实仍然存在:)

于 2014-05-15T21:58:32.273 回答