2013-03-09 75 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