【发布时间】:2012-06-20 02:16:57
【问题描述】:
我正在使用基于 java 的上传构造 http://www.javaatwork.com/java-upload-applet/details.html,我尝试在夜间运行。
- 它基本上将所有内容都存储在服务器的硬盘上 (/var/www/private/$userId)
- 确保数据格式正确
- 然后将其传递到永久存储 (Amazon S3)。
第 1 步完成后,我运行以下代码:
if($_SESSION['userId'])
{//Makes sure that data is well-formed}
else
{echo 'you are not logged in';}
我尝试运行它四个小时,却发现you are not logged in 打印到屏幕上。
以下是 cgi php.ini 文件中的相应指令(我使用的是 ubuntu 12.04 和 apache2。)
session.gc_probability = 0
session.gc_divisor = 1000
session.gc_maxlifetime = 14400 //this is 30 hours, which is far greater than the 4 hours it was running
session.cache_expire = 1800
session.cookie_lifetime = 0
除了session.gc_probability 和session.gc_maxlifetime 之外,大多数这些指令都是默认的。
我正在尝试解决此问题,并遇到了 Jeff 的一个非常有用的博客,我从中推断,如果浏览器内的网站一段时间不活动,浏览器可能会导致存储在浏览器中的 PHPSESSID cookie 被删除.他建议
“在浏览器中创建一个后台 JavaScript 进程,定期向服务器发送心跳。重新生成一个具有定时过期的新 cookie,例如,每 5 或 10 分钟一次。” http://www.codinghorror.com/blog/2008/04/your-session-has-timed-out.html
所以我决定这样做。
function myTimeoutFunction()
{
$.ajax({
url: "heartbeat.php",
success: function() {
}
});
setTimeout(myTimeoutFunction, 15*60*1000);
}
myTimeoutFunction();
heartbeat.php
<?php session_start(); ?>
我将对此进行测试,以便上传大约需要 4 小时。但是我刚刚阅读了以下内容
通常你可以说 session.gc_maxlifetime 指定自上次更改会话数据以来的最大生命周期(不是上次调用 session_start 时)
https://stackoverflow.com/a/1516338/784637
如果我有 3 个会话变量 $_SESSION['userId'] $_SESSION['firstName'] $_SESSION['lastName'],我是否需要重置它们在 heartbeat.php 中的所有值
session_start();
$_SESSION['userId'] = $_SESSION['userId'];
$_SESSION['firstName'] = $_SESSION['firstName'];
$_SESSION['lastName'] = $_SESSION['lastName'];
或者我可以只重置一个值
session_start();
$_SESSION['lastHeartbeat'] = time();
这样其他三个就不会过期了?
【问题讨论】: