幾個月來,我一直在使用下面的代碼沒有問題來跟蹤我的網站上的獨特會話,但最近剛剛停止工作,原因不明。如果我在單獨的文件中測試代碼,它的工作原理與我原先的想法一樣。會話不按預期工作
該代碼檢查是否存在會話,如果不存在,則創建它並將其設置爲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