我理解PHP将用户的会话ID存储在名为“PHPSESSID”的cookie中,该cookie存储在客户端的浏览器中,并与服务器上的会话进行匹配,以便能够关联浏览器。 会话信息消失,但客户端上的cookie仍然存在。是否可以使用此cookie来恢复旧会话?或者,当客户端关闭浏览器时,是否会从服务器中删除所有会话数据?
我首先在我的页面上有这个:
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
关闭浏览器后如何检索旧会话信息,是否可能?
答案 0 :(得分:4)
会话完全按照它在锡上所说的内容 - 在客户端会话期间存在。按关闭浏览会话(例如有一个)会在您关闭浏览器时结束。
基于Cookie的会话通过将在PHP中定义的生命周期的cookie设置为0
来工作 - 这意味着浏览器在浏览器关闭时应该销毁cookie。一旦cookie被销毁,会话ID就不会在任何后续服务器请求中发送,因此会话数据将无法在PHP脚本中使用。
但是,如您所建议的那样,当用户关闭浏览器时,会话数据不会在服务器端销毁 - 这是不可能的,因为客户端不会通知服务器它已被关闭。相反,服务器端的会话数据具有TTL(生存时间),其默认值为15分钟。在此过期之后,会话垃圾收集器随时可以删除数据 。理论上这可能是相当长的一段时间,但在繁忙的服务器上实际上,数据将在TTL到期后的几分钟内被删除。
但是,除非会话ID具有会话ID,否则PHP无法使会话数据可用,如果cookie已被销毁,则不会有会话ID,正如我所说,当用户关闭浏览器时,会发生这种情况。
因此问题How can I restore a PHP session?
的简短回答是:你不能
答案 1 :(得分:3)
不应接受此处接受的答案。你肯定可以恢复一个会话,只要它还没有被清除。这真的很简单。
<?php
session_id($the_id_of_the_session_you_want_to_reopen);
session_start();
?>
我找到了答案here。
答案 2 :(得分:2)
这可能是您正在寻找的答案,也可能不是。
据我所知,您无法根据会话cookie“恢复”会话。我所做的是存储一个cookie,其中包含客户端的id,用户名和密码,salted和hashed。我还用他们的id存储另一个。我在访问网站时检查两个cookie,然后相互验证,然后自动登录。虽然这不会“恢复”他们的会话,但是当他们关闭浏览器时,它允许他们保持登录我的网站。这就是我想要做到的,我想如果有人劫持或查看其他用户的cookie,用我使用的盐解密几乎是不可能的。他们将获得的唯一信息是用户的ID。
答案 3 :(得分:1)