Php 会话未按预期工作

Php 会话未按预期工作,php,session,Php,Session,几个月来,我一直在使用下面的代码毫无问题地跟踪我站点上的唯一会话,但最近由于未知原因它停止了工作。如果我在一个单独的文件中测试代码,它将按照我最初的预期工作 代码检查会话是否存在,如果不存在,则创建会话并将其设置为TRUE。然后,它执行第二次检查,查看会话是否为TRUE,然后将会话更改为FALSE,命中结果存储在数据库中。这在每个会话中发生一次 实现这一目标的代码是: <?php session_start(); // If the session DOES NOT EXIST, ma

几个月来,我一直在使用下面的代码毫无问题地跟踪我站点上的唯一会话,但最近由于未知原因它停止了工作。如果我在一个单独的文件中测试代码,它将按照我最初的预期工作

代码检查会话是否存在,如果不存在,则创建会话并将其设置为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\u session\u id
变量都会更改,如果逻辑不受影响,这是不可能的。我唯一的结论是,在页面刷新之间,会话正在被删除或丢失

注释

  • 我使用的是我从头开始编写的MVC模式
  • session\u start()
    在中的任何其他PHP行之前被调用
    index.php
  • 我已尝试将
    会话\u start()
    移动到文件中的各个位置, 在创建会话之前包括。这没用
  • 我尝试过使用
    session\u write\u close()
    ,但它不起作用
无论发生多少次页面刷新,每个会话只应执行一次这两条逻辑语句,并且已经以这种方式工作了2-3个月。为什么每次刷新页面后,它们都会突然开始执行?每次刷新页面时,逻辑被评估为TRUE的会话变量发生了什么

编辑


现在,通过从web主机请求一个新的php.ini文件,会话问题已得到修复。

您的代码可以按照编写的方式工作 请看代码注释

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
}
但是,如果$\u SESSION['new\u visit']为false,则表示设置了$\u SESSION['new\u 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\u visit
不要将会话用于该语句。

您的代码可以按编写的方式工作 请看代码注释

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
}
但是,如果$\u SESSION['new\u visit']为false,则表示设置了$\u SESSION['new\u 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\u visit
不要将会话用于该语句。

更新:

将此特定会话处理代码保存在一个单独的文件中,开始时需要将该文件保存在所有文件中

我注意到,您必须至少重新加载一次才能获得会话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']);
取消设置某个会话。

已更新:

将此特定会话处理代码保存在一个单独的文件中,开始时需要将该文件保存在所有文件中

我注意到,您必须至少重新加载一次才能获得会话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']);

取消设置某个会话。

您是否检查了Php设置中最近的任何更改?@Josh Austin否。我也不知道需要检查哪些设置。我假设我可以使用
phpinfo()
检查相关的必要设置?作为记录,我自己没有更改任何设置。有相当多的会话设置。您应该与当前设置进行比较。您可以将唯一ID放在一边,首先检查会话是否保留或删除。在我看来,这更像是一个cookie问题,可能与仅ssl cookie有关。正如Josh Austin所评论的,检查手册中记录的PHP设置。PHP设置未更改/设置为默认值。每次刷新页面时,会话似乎都没有进行。这很奇怪,因为我相信其他人都是。你检查过Php设置最近有什么变化吗?@Josh Austin没有。我也不知道需要检查哪些设置。我假设我可以使用
phpinfo()
检查相关的必要设置?作为记录,我自己没有更改任何设置。有相当多的会话设置。您应该与当前设置进行比较。您可以将唯一ID放在一边,首先检查会话是否保留或删除。在我看来,这更像是一个cookie问题,可能与仅ssl cookie有关。正如Josh Austin所评论的,检查手册中记录的PHP设置。PHP设置未更改/设置为默认值。每次刷新页面时,会话似乎都没有进行。这很奇怪,因为我相信其他人都是。在会话上使用
unset()
会破坏会话,导致每次刷新页面时都出现不正确的行为。这样做将计算每次刷新页面时的会话数。我现在的问题是,尽管我的代码在单独的文件中单独测试时处于工作状态,但它总是忽略逻辑语句并执行它们的代码块。也就是说,在页面刷新之间,会话要么被忽略,要么被删除,我倾向于认为是后者。unset只是一个例子,我不知道你的cod