为什么我的PHP会话一直在清除?

时间:2012-07-26 16:56:43

标签: php session sessionid

我在网上阅读了大量有关会话安全的内容后,正在编写PHP登录脚本。但是,我遇到的问题是会话信息在页面之间不一致。可能有一种与我正在使用的方法有关的行为,我忽略了,但我不是一个PHP或会话专家。我遇到问题的代码是在每个页面head中调用的会话启动函数中:

//Setup the session
session_name('CPI_SESSION');
session_set_cookie_params(0, '/', $_SERVER['SERVER_NAME'], (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : true), true); 
//Start the session
session_start();

print_r($_SESSION);
echo '<br/>';
if(!isset($_SESSION['session_init']))
{
     session_regenerate_id(true);
     $_SESSION['session_init'] = true;

     print_r($_SESSION);
}

我正在使用的方法我读到here。我修改的唯一内容是session_regenerate_id删除旧会话,这是我想要的行为。但是,我得到意想不到的结果。 echo我看起来像这样:

  

Array()
数组([session_init] =&gt; 1)

分别来自每个print_r。因此,每次调用该函数时,由于某些原因,我知道会话为空,这会导致它重新生成id并清除已经空的会话,然后设置session_init。如果我刷新页面,session_init仍应保存,但事实并非如此。这导致它再次做同样的事情。为什么是这样?我已经尝试评论session_namesession_set_cookie_params,但它没有任何区别。

我在本地运行Apache 2.2服务器和PHP 5.3。

1 个答案:

答案 0 :(得分:1)

这似乎是会话生命周期的问题。 [session_set_cookie_params](http://www.php.net/manual/en/function.session-set-cookie-params.php)将会话将作为第一个参数持续的秒数。在您的代码中,它设置为0.尝试将其更改为更高的数字。

<?php
//Setup the session
session_name('CPI_SESSION');
// set session time to 4 hours
session_set_cookie_params(3600*4, '/', $_SERVER['SERVER_NAME'], (isset($_SERVER['HTTPS']) ? true : false), true);      
//Start the session
session_start();

print_r($_SESSION);
echo '<br/>';
if(!isset($_SESSION['session_init']))
{
     session_regenerate_id(true);
     $_SESSION['session_init'] = true;

     print_r($_SESSION);
}
?>