2012-01-12 155 views
5

我知道PHP将用户的会话ID存储在一个名为“PHPSESSID”的cookie中,该cookie存储在客户端的浏览器中,并与服务器上的会话相匹配,以便能够关联该会话。关闭浏览器 会话信息消失,但客户端上的cookie仍然存在。是否可以使用此cookie来恢复旧会话?或者在客户端关闭浏览器的时候,所有会话数据都会从服务器中删除?如何恢复PHP会话?

我第一次有这种我的网页上:

session_start(); 
$_SESSION['message'] = 'Hello'; 

echo $_SESSION['message']; // outputs hello 

然后我改变了页面:

$old_session = session_id(); 
session_id($old_session); 
session_start(); 

echo $_SESSION['message']; 

然后我关闭了浏览器,重新打开这个页面,得到了这些错误:

Warning: session_start() [function.session-start]: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in C:\xampp\htdocs\localhost\test.php on line 5 

Notice: Undefined index: message in C:\xampp\htdocs\localhost\test.php on line 7 

关闭浏览器后,人们如何检索旧会话信息,这甚至有可能吗?

+1

'关闭浏览器后,会话信息消失,但客户端上的cookie仍然存在。“---这是不正确的。在大多数情况下,会话ID cookie的生命被设置为“在浏览器未关闭之前”。 '$ old_session = session_id(); session_id($ old_session);'---这段代码没有意义 – zerkms 2012-01-12 21:58:46

+0

http://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime – j08691 2012-01-12 21:59:08

+0

除非你透过用户的窗口,当他关闭浏览器时,服务器将不知道(AJAX也不能保证它)。服务器只是删除被认为“旧”的会话数据。 – webbiedave 2012-01-12 22:07:42

回答

4

会话完全按照客户会话期间的说法进行。根据定义(如有一个)浏览会话在关闭浏览器时结束。

基于Cookie的会话通过设置一个在PHP中定义的生命周期的cookie作为0 - 这意味着浏览器在浏览器关闭时应该销毁cookie。一旦cookie被销毁,会话ID就不会在任何后续的服务器请求中发送,因此会话数据将不会在您的PHP脚本中可用。

但是,在用户关闭浏览器时服务器端的会话数据不会被销毁,正如您所建议的 - 这是不可能的,因为客户端不会通知服务器它已关闭。相反,服务器端的会话数据具有TTL(生存时间),其默认值为15分钟。在此过期后,数据可能会在任何时候被会话垃圾收集器删除。理论上这可能是相当长的一段时间,但实际上在繁忙的服务器上,数据将在TTL过期几分钟内被删除。

但是,PHP不能使会话数据可用,除非它具有会话ID,并且如果cookie已被销毁(如我所说,它将在用户关闭其浏览器时发生),它将不具有会话ID。

因此短期问题的答案How can I restore a PHP session?是:你不能

+1

我看到,很高兴知道浏览器关闭时服务器数据未被删除。我能够通过创建另一个cookie并将当前session_id()存储在其中来解决恢复需求。然后,当浏览器重新打开时,我做了session_id($ _ COOKIE ['old_session']);并能够恢复之前的会话信息。 – TK123 2012-01-12 22:33:56

1

session_start set的cookie。

该cookie默认设置了一个param cookie-lifetime

cookie的生存期设置为0

0表示直到浏览器关闭

2

这可能是也可能不是你要找的答案。

据我所知,根据会话cookie无法“恢复”会话。我所做的是存储一个cookie,其中包含客户端的ID,用户名和密码,并进行腌制和散列。我也用他们的ID存储另一个。当他们访问网站时,我会检查这两个cookie,然后相互验证它们,然后自动登录它们。虽然这不会“恢复”他们的会话,但是当他们关闭浏览器时,它允许他们保持登录我的网站。这就是我想要这么做的原因,我想如果有人劫持或查看其他用户的cookies,用我使用的盐解密几乎是不可能的。他们获得的唯一信息是用户的ID。

+1

为什么不呢?会话ID是存储在cookie中的值。会话cookie的名称是'session_name()',存储在其中的值是'session_id()'。 – 2012-01-12 22:07:59

+0

我只是从来没有这样做过,因为我认为会话会很快从服务器上删除(也许几个小时左右的时间不活动,除非我要更改设置),并且使用cookie方法将允许原始会话被删除但仍然登录。 – 2012-01-12 22:10:44

+1

php会话cookie不会存储除会话ID以外的任何内容。如果会话文件不存在,则会话消失,将创建一个新文件,留下空白会话。 – 2012-01-12 22:25:49

1

这里接受的答案不应该被接受。只要尚未清除,您肯定可以恢复会话。这真的很简单。

<?php 
    session_id($the_id_of_the_session_you_want_to_reopen); 
    session_start(); 
?> 

我找到了答案here