php - 40分钟后,PHP会话即将过期

  显示原文与译文双语对照的内容
0 0

我编写了这个代码来管理会话,以便在关闭浏览器或者用户是否处于活动状态时应该过期。 但似乎会话在 40分钟后会过期,我真的不会得到这种情况的可以能性。 如果代码失败,我希望它们应该持续 1440秒的( 24分钟) 。


define("MY_SESSION","mysession");
define("SESSION_DURATION", 7200);
function my_session_start() {
 if (session_status()!= PHP_SESSION_NONE)
 return;
 ini_set('session.gc_maxlifetime', SESSION_DURATION);
 ini_set('session.cookie_lifetime', 0);
 session_set_cookie_params(0);
 session_name(MY_SESSION);
 session_start();
 if ((!isset($_SESSION['EXPIRES'])) || ($_SESSION['EXPIRES'] <time())) {
 $_SESSION = array();
 session_unset();
 session_destroy();
 session_start();
 }
 $_SESSION['EXPIRES'] = time() + SESSION_DURATION;
 if (isset($_SESSION['REGENERATE'])) {
 $_SESSION['REGENERATE']++;
 if ($_SESSION['REGENERATE']> = mt_rand(90,100)) {
 $_SESSION['REGENERATE'] = 0;
 session_regenerate_id(true);
 }
 }
 else {
 $_SESSION['REGENERATE'] = 0;
 session_regenerate_id(true);
 }
}

我把 my_session_start() 放在每个PHP文件中。 我在共享服务器上,但 ini_set() 没有被阻止,并且通过 my_session_start() 启动 phpinfo(),我可以看到 session.gc_maxlifetime 本地值设置为 7200 ( 主数值为 1440 ) 。 session.gc_probabilitysession.gc_divisor的默认值为( 分别 1和 100 ) 。 我还在 90 -100页负载/ajax调用的随机基础上重新生成会话,但这并不重要。

那么我的代码有什么问题? 那分钟的数量来自哪里我的意思是 40分钟?

时间: 原作者:

0 0

所以我终于找到了解决这个问题的方法。 解决方案是更改保存文件夹的会话文件:


ini_set('session.save_path',"/the/new/path/to/sessions/");//DEFAULT:/var/lib/php5

这样做意味着可以查看会话文件,因此我添加了包含以下内容的。htaccess文件:

 
deny from all

 

在"/the/new/path/to/sessions/" 文件夹中,因此无法从服务器外部查看任何内容。

另外,我还必须添加一个新的会话垃圾收集功能:


function clear_old_sessions() {
 $folder ="/the/new/path/to/sessions/";
 $files = scandir($folder);
 for ($i = 0; $i <count($files); $i++) {
 $file = $folder. $files[$i];
 if (file_exists($file))
 if (!is_dir($file))
 if (is_file($file))
 if (substr($files[$i], 0, 5) =="sess_")
 if ((filemtime($file) + SESSION_DURATION) <time())//SESSION_DURATION previosuly defined as 7200 (seconds)
 unlink($file);
 }
}

原作者:
...