2011-05-11 48 views
7

嘿傢伙,這將是我的第一個問題在Stackoverflow。檢查是否有會話沒有使用session_start()

我想檢查一個人是否有一個活動的會話,並將他們重定向到另一個頁面時,他們有一個。但是,我不想使用session_start(),因爲這會在個人電腦上放置一個cookie(當他們沒有登錄時,我不想在個人電腦上放置cookie)。有沒有辦法檢查現有會話,而不在他們的PC上放置cookie?

在此先感謝。

+2

使用'session_start'很好。如果你在用戶的電腦上沒有登錄,就把cookie放在用戶的個人電腦上,這並不重要。 – 2011-05-11 14:46:38

+0

也許客戶端上一個不需要的cookie不是什麼大問題,但'session_start'也會在服務器上創建一個空的會話文件(這也將在稍後的某個時間點進行GC編輯)。所以它不是免費的。 – ddekany 2011-07-26 14:43:36

回答

7

您可以在網站的其他地方檢查會話ID的cookie,客戶端會發送回的存在,如果那是以前的一組:

if (isset($_COOKIE[session_name()])) { 
    ... most likely there's a session available to be loaded ... 
} 

爲了增加安全性,那麼你可以檢查的會議文件是否存在(假設你使用默認的基於文件的處理程序),使用session_save_path()session_name()建立的路徑傳遞到file_exists()

+0

+1 |請注意亞倫:注意馬克說**可能**會議可用。如果會話還沒有過期,但你的服務器終止了會話,'isset($ _ COOKIE [session_name()])'仍然會返回true。用戶瀏覽器將發送cookie,因爲它無法初步判斷該會話是否過早終止。 – MicronXD 2011-05-11 14:55:45

+0

我認爲這種方法不能確保你的會話是否仍然有效。 可能是客戶端發送cookie的情況下,服務器上的文件仍然存在但已被標記爲已到期的 。當GC運行時,該文件將被刪除 ! – 2011-05-11 14:56:32

+0

非常感謝您的回覆。我將如何檢查會話是否過期? – 2011-05-11 15:15:25

2

您可以檢查對功能session_id(),這將返回當前用戶的會話ID或空字符串如果沒有會話存在:

if (empty(session_id())) { 
    /* redirect or logic here here, example: */ 
    header('location:path/to/your/session/start/page'); 
    exit(); 
} 

或者你可以檢查會話cookie /全局變量設置(isset($_SESSION)isset($_COOKIE[session_name()]。 Doc for session_id()here

2

先測試一下,但我認爲session_id() != ""會給出true,如果有會話則返回false,否則返回false。

+1

在括號外不需要'!',只需執行'session_id()!=「」',或者更好'!empty(session_id() )'。 – 2011-05-11 14:52:40

+0

'session_id()'似乎總是向我返回一個空字符串,即使我有一個活動會話。 – 2011-05-11 15:16:40