2010-02-19 17 views
0

我在長時間保存會話狀態時遇到了麻煩。我使用會話來保存登錄狀態。在任何其他代碼之前,我需要在每個頁面頂部的下面的代碼片段。首先,有沒有我錯過的設置?php如何保存會話狀態很長一段時間?麻煩

session_cache_expire(2880); //set session to expire in 48 hours 
session_start(); 

有些人在48小時過期前註銷。什麼類型的東西可能導致這種情況?我知道關閉瀏覽器殺死會話,情況並非如此。

據我所知,當用戶閒置幾個小時或更長時間時會發生這種情況。

用戶在主動瀏覽網站時從未註銷。

什麼給?

+0

我還以爲那寫會話數據進行某種永久存儲(即數據庫),然後重裝它當用戶返回到該網站會比濫用這樣的會議一個更好的解決方案。 – Ant 2010-02-19 14:47:27

+0

我不知道有關濫用情況...使用單個會話變量來跟蹤用戶登錄..是好..好吧。 – payling 2010-02-19 15:01:28

+0

我同意Ant,長時間的會話壽命增加了黑客可以訪問會話的窗口。我個人傾向於使用30分鐘的超時時間。如果用戶與會話交互,則30分鐘再次開始。您是否會在開機,登錄和解鎖2天后讓您的電腦無人值守? – 2010-02-19 15:06:35

回答

1

這隻影響瀏覽器緩存會話頁面的時間。

嘗試設置gc_maxlifetime變量(值是以秒):

ini_set("session.gc_maxlifetime", "172800"); 
+0

這是PHP 5.3正確嗎?我提到我在使用5.2.5嗎?哎呀.. – payling 2010-02-19 14:58:54

+0

自PHP4以來,ini_set和session.gc_maxlifetime都在PHP中,因此它們將在5.1,5.2,5.3 ...上工作。 – 2010-02-19 15:04:29

+0

哦,我看了手冊,它說PHP5> = 5.3。起初我沒有正確閱讀。謝謝! – payling 2010-02-19 15:13:39

1

session_cache_expire僅影響HTTP緩存過期時間。你想要做的是使用cookie來設置你的會話數據。

以下是我用於登錄/註銷會話的示例。

<?php 

session_start(); 

if ($action == "logout") { 
    setcookie('sId', '', time()-60*60*24*365); //set sId cookie to expire 

    session_destroy(); 
} else if (empty($_SESSION['sId'])) { //if cannot get sId from session 
    if (isset($_COOKIE['sId'])) { //check if sId is in cookie 
    $sId = $_COOKIE['sId']; 
    } else { //get a new sId and set to cookie 
    $sId = session_id(); 
    setcookie('sId', $sId, time()+60*60*24*365); 
    } 

    $_SESSION['sId'] = $sId; 
} else { //get sId from session 
    $sId = $_SESSION['sId']; 
} 

?> 
+0

我存儲的會話變量是用戶登錄ID,將它存儲在cookie中是一個好主意嗎? – payling 2010-02-19 15:19:53

+0

Cookie並不是存儲會話數據的絕佳方式 - 尤其是在敏感的情況下,因爲每次請求都會傳遞到服務器以及從服務器傳出。這是您希望存儲在PHP中作爲標準的cookie中的會話ID,然後使用php.ini來自定義會話處理(例如超時)或編寫自己的會話。 – 2010-02-22 13:02:52