2013-03-09 37 views
1

几个月来,我一直在使用下面的代码没有问题来跟踪我的网站上的独特会话,但最近刚刚停止工作,原因不明。如果我在单独的文件中测试代码,它的工作原理与我原先的想法一样。会话不按预期工作

该代码检查是否存在会话,如果不存在,则创建它并将其设置为TRUE。然后执行第二次检查以查看该会话是否为TRUE,然后将其更改为FALSE并将该命中存储在数据库中。每次会话都会发生一次。

的代码实现这一目标是:

<?php 

session_start(); 

// If the session DOES NOT EXIST, make it and set it to TRUE. 
if(!isset($_SESSION['new_visit'])) 
{ 
    $_SESSION['new_visit'] = true; 
} 

// If the session is TRUE, make it false. 
if($_SESSION['new_visit'] == true) 
{  
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 

    $_SESSION['new_visit'] = false; 
} 

echo $_SESSION['unique_session_id']; 

当我运行这段代码,如预期,无论多少次,我刷新页面,则输出永远不会改变。 'unique_session_id'变量始终保持不变,因为每个if语句只能执行一次。但是,我的生产代码包含这个确切的代码,但突然停止工作。我的生产代码是这样的:

<?php 

if(empty($article_data)) 
{ 
    $no_article = true; 
} 

$options  = $this->db->get_options(); 
$server_options = $this->db->server_options(); 

// Check site status (on/off). 
if($options['status'] == "off") 
{ 
    echo $options['offline_message']; 

    exit(); // Equal to die. 
} 

if($server_options['force_ssl'] == "on") 
{ 
    if($_SERVER["HTTPS"] != "on") 
    { 
     header("HTTP/1.1 301 Moved Permanently"); 
     exit(header("Location: https://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"])); 
    } 
} 

$this->db->store_hit(); 
$this->db->store_ip(); 

//---------------------------------------------------------------------------------------------------------- 
// Store visits (individual sessions). Visits are not unique hits. Visits are the number of unique sessions, 
// so a single person may accumulate many visits (sessions), i.e., returning users. 
//---------------------------------------------------------------------------------------------------------- 

// If the session DOES NOT EXIST, make it and set it to TRUE. 
if(!isset($_SESSION['new_visit'])) 
{ 
    $_SESSION['new_visit'] = true;  
} 

// If the session is TRUE, make it false. 
if($_SESSION['new_visit'] == true) 
{ 
    $this->db->store_visit(); 

    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 

    $_SESSION['new_visit'] = false; 
} 

?><!DOCTYPE html> 
<html> 

... 

</html> 

正如你可以看到这个代码是相同的,但我每次刷新页面的unique_session_id变量的变化,这是不可能的,如果逻辑不受影响。我唯一的结论是会话在页面刷新之间被删除或丢失。

  • 我用我已经从头开始编写MVC模式。
  • session_start()index.php之前的任何其他PHP行被调用。
  • 我试过将session_start()移动到文件中的不同位置 ,包括正好在会话创建之前。这什么都不做。
  • 我试过使用session_write_close(),它不起作用。

无论发生多少次页面刷新,2个逻辑语句只应该在每个会话中执行一次,并且一直以这种方式工作2-3个月。他们为什么在每次刷新页面后突然开始执行?我的会话发生了什么事情,每次页面刷新时都会评估逻辑是否为TRUE?

编辑

会议问题已得到修复,要求从虚拟主机新的php.ini文件。

+2

您是否检查过Php设置中的任何最近更改? – 2013-03-09 21:54:14

+0

@JoshAustin号我也不知道我需要检查哪些设置。我假设我可以使用'phpinfo()'来检查有问题的必要设置?为了记录,我自己并没有改变任何设置。 – George88 2013-03-09 21:58:05

+0

还有一些会话[配置](http://www.php.net/manual/en/session.configuration.php)设置。你应该比较你的当前设置。 – 2013-03-09 22:15:04

回答

1

你的代码正如你写的 请看代码注释。

if(!isset($_SESSION['new_visit'])) //1st time is not set so enter's to statement 
{ 
    $_SESSION['new_visit'] = true; //making $_SESSION['new_visit'] true 
} 

if($_SESSION['new_visit'] == true) //1st time its true 
{ 
    $this->db->store_visit(); 
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 
    $_SESSION['new_visit'] = false; //You make it false 
} 

但是当$ _SESSION [ 'new_visit']是假的,是不是意味着$ _SESSION [ 'new_visit']设置。现在第二次或更多次:

if(!isset($_SESSION['new_visit'])) //variable is set, and it will not enter here 
{ 
    $_SESSION['new_visit'] = true; // variable stays false 
} 

if($_SESSION['new_visit'] == true) //variable is false !!! 
{ 
    $this->db->store_visit(); 
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 
    $_SESSION['new_visit'] = false; 
} 
// Finally $_SESSION['unique_session_id'] stays same. 

您可以使用unset($_SESSION['new_visit']);或者如果它仅适用于本声明或在一个页面检查,使用可变像$new_visit没有为使用会话。

+0

在会话中使用'unset()'会破坏它,每次页面刷新时都会导致不适当的行为。这样做会在每次刷新页面时统计一次会话。我这个时候的问题是,尽管我的代码在单独的文件中进行测试时处于正常工作状态,但它总是忽略逻辑语句并执行它们的代码块。也就是说,会话在页面刷新之间被忽略或被删除,后者我倾向于认为是这种情况。 – George88 2013-03-09 22:13:21

+0

unset仅仅是一个例子,我并不完全了解你的代码,这个问题有很多解决方案,但是为什么unique_session_id保持不变,它来自true/false和isset函数。 – 2013-03-09 22:17:26

+0

我想你可能会感到困惑。我编辑了我的问题,使其更清楚我的问题是什么。我的逻辑不是这里的问题,预期的结果是'unique_session_id'会话在页面刷新之间保持不变,并且每个'if'语句只执行一次才能实现此目标。这样做,我可以跟踪唯一的访问(会话),而不会为每个页面查看造成额外的访问。问题在于会话似乎被忽略,可能是因为它们在每次刷新页面后都会被删除。这导致'unique_session_id'在刷新时改变每一个。 – George88 2013-03-09 23:38:12

0

更新时间:

保存这个特定的会话中,您在您的所有文件的开头需要一个单独的文件处理代码。

我注意到,你需要重新加载至少一次,以获得一个会话ID,而不是你能做到这一点,也简化了复杂性:

if(!isset($_SESSION['new_visit'])) 
{ 
    $_SESSION['new_visit'] = true; 
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 
} 
echo $_SESSION['unique_session_id']; 

我也是瞎猜你是不正确使用session_start(),并且在所有文件的开始部分使用。一旦你输入了一个没有的页面或者使用不正确的页面,那么事情就搞砸了。


注意:您可以使用

session_destroy(); 

删除每一个设置会话存在。您也可以使用

unset($_SESSION['new_visit']); 

取消设置某个会话。

+0

你错误地理解了我的问题,所以我修改了它以使其更清楚。每次页面加载时我都不想'unique_session_id'发生变化,这是我的观点。我问这个问题的原因是因为它突然开始改变,尽管代码没有受到影响。我的逻辑已经工作了好几个月,但现在它已停止,我无法弄清楚原因。如果我在每次加载页面时想要一个唯一的ID,我只需使用'echo uniqid(“”,true)'来实现这一点。问题似乎是刷新页面时会话被删除,或者逻辑被PHP忽略。 – George88 2013-03-09 22:25:24

+0

我更新了我的答案。 – Jonast92 2013-03-09 22:52:54