如何恢复PHP会话?
我知道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
关闭浏览器后,人们如何检索旧会话信息,这甚至有可能吗?
会话完全按照客户会话期间的说法进行。根据定义(如有一个)浏览会话在关闭浏览器时结束。
基于Cookie的会话通过设置一个在PHP中定义的生命周期的cookie作为0
- 这意味着浏览器在浏览器关闭时应该销毁cookie。一旦cookie被销毁,会话ID就不会在任何后续的服务器请求中发送,因此会话数据将不会在您的PHP脚本中可用。
但是,在用户关闭浏览器时服务器端的会话数据不会被销毁,正如您所建议的 - 这是不可能的,因为客户端不会通知服务器它已关闭。相反,服务器端的会话数据具有TTL(生存时间),其默认值为15分钟。在此过期后,数据可能会在任何时候被会话垃圾收集器删除。理论上这可能是相当长的一段时间,但实际上在繁忙的服务器上,数据将在TTL过期几分钟内被删除。
但是,PHP不能使会话数据可用,除非它具有会话ID,并且如果cookie已被销毁(如我所说,它将在用户关闭其浏览器时发生),它将不具有会话ID。
因此短期问题的答案How can I restore a PHP session?
是:你不能
我看到,很高兴知道浏览器关闭时服务器数据未被删除。我能够通过创建另一个cookie并将当前session_id()存储在其中来解决恢复需求。然后,当浏览器重新打开时,我做了session_id($ _ COOKIE ['old_session']);并能够恢复之前的会话信息。 – TK123 2012-01-12 22:33:56
这可能是也可能不是你要找的答案。
据我所知,根据会话cookie无法“恢复”会话。我所做的是存储一个cookie,其中包含客户端的ID,用户名和密码,并进行腌制和散列。我也用他们的ID存储另一个。当他们访问网站时,我会检查这两个cookie,然后相互验证它们,然后自动登录它们。虽然这不会“恢复”他们的会话,但是当他们关闭浏览器时,它允许他们保持登录我的网站。这就是我想要这么做的原因,我想如果有人劫持或查看其他用户的cookies,用我使用的盐解密几乎是不可能的。他们获得的唯一信息是用户的ID。
为什么不呢?会话ID是存储在cookie中的值。会话cookie的名称是'session_name()',存储在其中的值是'session_id()'。 – 2012-01-12 22:07:59
我只是从来没有这样做过,因为我认为会话会很快从服务器上删除(也许几个小时左右的时间不活动,除非我要更改设置),并且使用cookie方法将允许原始会话被删除但仍然登录。 – 2012-01-12 22:10:44
php会话cookie不会存储除会话ID以外的任何内容。如果会话文件不存在,则会话消失,将创建一个新文件,留下空白会话。 – 2012-01-12 22:25:49
这里接受的答案不应该被接受。只要尚未清除,您肯定可以恢复会话。这真的很简单。
<?php
session_id($the_id_of_the_session_you_want_to_reopen);
session_start();
?>
我找到了答案here。
'关闭浏览器后,会话信息消失,但客户端上的cookie仍然存在。“---这是不正确的。在大多数情况下,会话ID cookie的生命被设置为“在浏览器未关闭之前”。 '$ old_session = session_id(); session_id($ old_session);'---这段代码没有意义 – zerkms 2012-01-12 21:58:46
http://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime – j08691 2012-01-12 21:59:08
除非你透过用户的窗口,当他关闭浏览器时,服务器将不知道(AJAX也不能保证它)。服务器只是删除被认为“旧”的会话数据。 – webbiedave 2012-01-12 22:07:42