如何保持会话活着而不重新加载页面?

时间:2012-09-26 08:02:20

标签: php session cookies

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

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

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

这不是代码问题

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

ini_set('session.gc_maxlifetime', 18000);

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

请帮帮我

由于

2 个答案:

答案 0 :(得分:32)

你可以使用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
);
};

refresh_session.php

<?php
session_start();

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

无论如何,另一种解决方案是仅使用扩展测试页面的会话时间 这里提出的解决方案

How do I expire a PHP session after 30 minutes?

答案 1 :(得分:11)

你只需要这个(使用jQuery作为$ .post):

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

(我知道这与接受的答案几乎相同,我真的想对那个评论,但我还没有足够的声誉。
最大的变化是在JavaScript中,您不需要整个函数,只需要一行。)



EXTRA INFO:

虽然我认为仅仅在php中调用session_start()就足够了,如果我读得正确(http://nl3.php.net/function.session-start):

  

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

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

无论哪种方式,我都希望确保我需要的会话变​​量真的还在那里:)