如何恢复PHP会话?

TK1*_*123 5 php browser session

我理解PHP将用户的会话ID存储在名为"PHPSESSID"的cookie中,该cookie存储在客户端的浏览器中,并与服务器上的会话进行匹配,以便能够关联2.关闭浏览器后,会话信息消失但是客户端上的cookie仍然存在.是否可以使用此cookie来恢复旧会话?或者,客户端关闭浏览器时,是否会从服务器中删除所有会话数据?

我首先在我的页面上有这个:

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

echo $_SESSION['message']; // outputs hello
Run Code Online (Sandbox Code Playgroud)

然后我将页面更改为:

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

echo $_SESSION['message'];
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

Alt*_*ime 5

这里接受的答案不应被接受。只要尚未清除会话,您当然可以恢复它。真的就是这么简单。

<?php
   session_id($the_id_of_the_session_you_want_to_reopen);
   session_start();
?>
Run Code Online (Sandbox Code Playgroud)

我在这里找到了答案。


Dav*_*dom 4

会话正如其表面上所说的那样——在客户端会话期间存在。根据定义,浏览会话(例如有一个)会在您关闭浏览器时结束。

基于 Cookie 的会话通过设置一个 cookie 来工作,该 cookie 的生存期在 PHP 中定义为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']); 并能够取回之前的会话信息。 (2认同)