几个月来,我一直在使用以下代码没有问题来跟踪我网站上的唯一会话,但它最近因为一个未知原因而停止工作。如果我在单独的文件中测试代码,它就像我最初的预期一样。
代码检查会话是否存在,如果不存在则创建会话并将其设置为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
变量都会发生变化,如果逻辑不受影响,这是不可能的。我唯一的结论是会话在页面刷新之间被删除或丢失。
备注 :
session_start()
在任何其他PHP行之前被调用
index.php
。session_start()
移动到文件中的不同位置,
包括在会话创建之前。这没什么。session_write_close()
,但它不起作用。每个会话只能执行一次2个逻辑语句,无论发生多少次页面刷新,并且已经以这种方式工作2-3个月。为什么他们在每次刷新页面后突然开始执行?我的会话发生了什么,每次页面刷新时逻辑被评估为TRUE?
修改
现在已通过从Web主机请求新的php.ini文件修复了会话问题。
答案 0 :(得分: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']为false时,表示$ _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
之类的变量不要使用会话。
答案 1 :(得分: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']);
取消某个会话。