2012-06-22 220 views
9

在用戶關閉瀏覽器之前,保持用戶登錄PHP網站的最佳方式是什麼?PHP會話或cookie

第一種也是最流行的方式是用$_SESSION。第二個是通過零作爲setcookie函數的第三個參數:setcookie(name, value, 0, domain);

+5

會話實際使用的cookie存儲SID –

+1

@AlvinWong我知道,但我的問題是,什麼是最好的PHP – treng

回答

18

由於PHP會議上實際存儲的cookie通過的SID(當然你也可以用其他的方式來設置SID如果你喜歡),就不會簡單地時使用它們有太大差別。

主要區別在於安全性,因爲如果您直接使用cookie,客戶端可以自己查看和/或編輯它們,但對於會話數據存儲在服務器端,因此客戶端無法直接訪問。

因此,如果數據只持續該會話,我更喜歡使用會話。

注意:如果您使用多個服務器來平衡負載,您應該非常小心,因爲會話數據默認存儲在服務器本地。可以在多個服務器上共享會話數據,但這是beyond the scope of this question。或者,您可以將數據存儲在數據庫中。

+2

使用您仍然可以在多個服務器環境中使用會話。通過將會話存儲在memcache中(http://php.net/manual/en/memcached.sessions.php) – Rizon

3

一個會話是爲了這個目的,所以我會去那。

3

「會話不依賴於允許Cookie的用戶,而是像令牌一樣允許在用戶打開瀏覽器的情況下訪問和傳遞信息。會話的問題在於,當關閉瀏覽器時,因此,如果您的網站需要登錄,則無法將其保存爲會話,就像它可以作爲cookie一樣,並且用戶每次訪問時都會被迫重新登錄。當然你可以得到兩全其美的好處!一旦你知道每件事情都做了什麼,你可以使用Cookie和會話的組合來使你的網站按照你想要的方式工作。「

http://php.about.com/od/learnphp/qt/session_cookie.htm

1

我會使用$ _SESSION作爲它的更容易。 :P無論如何,如上所述,決定你的情況..如果你需要讓用戶登錄一段時間,即使瀏覽器已關閉使用cookie,但正確。這可能會對您造成安全威脅!否則使用會話。

4

我建議你去參加PHP會議。它很簡單,你不必自己處理cookies。

以下是真正銷燬會話的代碼,從PHP手冊中給出的example複製粘貼。

// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 

關於你的問題:

什麼是更好地使用,以保持用戶登錄,直到他關閉瀏覽器?

確定用戶關閉瀏覽器的時間沒有確定的方法。一種方法是不斷地向服務器發送小的AJAX請求。如果延長的時間內沒有看到請求,請銷燬會話。

另一種方法是偵聽DOM窗口卸載並向服務器發送請求以銷燬會話。

3

你應該使用$ _SESSION

因爲如果啓用了Cookie,那麼cookie將被反正PHP會話標識符使用。所以編寫另一個cookie不是最佳的。

您希望使用cookie而不是會話的唯一原因是您想要負責平衡負載。因此,如果您有2臺服務器,其中一臺出現故障,則該服務器上的會話將丟失。現在登錄的用戶(在服務器1上有會話)將被要求再次登錄。但是如果他有一個cookie,他不會被要求再次登錄。

2

cookie被限制爲每個域可以設置20個Cookie和最大尺寸的每個爲4KB