2012-06-22 168 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