几个月来,我一直在使用下面的代码没有问题来跟踪我的网站上的独特会话,但最近刚刚停止工作,原因不明。如果我在单独的文件中测试代码,它的工作原理与我原先的想法一样。会话不按预期工作
该代码检查是否存在会话,如果不存在,则创建它并将其设置为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文件。
您是否检查过Php设置中的任何最近更改? – 2013-03-09 21:54:14
@JoshAustin号我也不知道我需要检查哪些设置。我假设我可以使用'phpinfo()'来检查有问题的必要设置?为了记录,我自己并没有改变任何设置。 – George88 2013-03-09 21:58:05
还有一些会话[配置](http://www.php.net/manual/en/session.configuration.php)设置。你应该比较你的当前设置。 – 2013-03-09 22:15:04