会话到期时运行一个函数?

时间:2011-11-09 04:03:51

标签: php

会话在PHP脚本上结束时是否可以运行函数?我的脚本会问几个问题,用户有30分钟的回答时间或会话过期。我希望我的脚本将任何进度保存到.txt文件如果会话过期并且用户尚未完成所有答案。我该怎么做呢?

我听说过register_shutdown_function('shutdown');但我很困惑我会在我的脚本中将其称为何处。

我当前的脚本是这样开始的:

 ini_set('session.gc_maxlifetime',1800);
 ini_set('session.gc_probability',1);
 ini_set('session.gc_divisor',1);
 session_start();
 if($_SESSION['loggedin'] !== 1) {//checks to see if user has logged in
 header('Location: login.php');
 exit;}

 ...asks a bunch of questions....
 session_destroy();

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您实际上有两个选择:

  1. 保存进度(每​​次回答后)并保存信息是否已完成。即使浏览器已关闭,此解决方案仍然有效(进度实时保存)。

  2. 使用AJAX每个例如调用服务器。 5秒钟,服务器应返回会话是否结束的信息。如果会话结束,那么在JS中做你需要的东西(甚至重定向到不同的页面)。此解决方案无法确保保存进度(在执行操作之前可能会关闭浏览器)。

  3. 您可以根据需要和应用程序的工作方式组合这两个选项。

    如果页面在每个答案后重新加载(例如重新加载以显示下一个问题),那么您可以使用选项号。 1 即可。如果所有问题都在一个页面上,请选择选项号。 2 即可。如果您的应用程序是两者的组合,您可以选择这两个选项。

    修改

    根据您的代码判断,您正在混合:

    • 会话就回答问题的时间而言
    • 会话在PHP中对页面的请求之间存储值

    最好的想法是将两者分开。为PHP会话提供更大的时间限制,因为它需要一些其他的东西,比如实际显示进度甚至保存进度。相反,标记测试开始的时间并将其存储在PHP会话中。这样,在测试时间结束后,您将能够确定并忽略之后回答的任何问题。

答案 1 :(得分:1)

立即想到几种方法。您可以使用PHP的内置sleep方法,也可以使用AJAX。不是说这是唯一的方式,只是第一个想到的方法。

编辑:现在我考虑一下,睡眠可能不是一个选项,因为它会超过最大运行时间并抛出错误。没有经过测试确认,但似乎合乎逻辑。所以AJAX是你最好的选择,假设我没有遗漏任何东西。