Как восстановить сессию PHP? - PullRequest
5 голосов
/ 13 января 2012

Я понимаю, что PHP сохраняет идентификатор сеанса пользователя в файле cookie с именем «PHPSESSID», который хранится в браузере клиента и сопоставляется с сеансом на сервере, чтобы иметь возможность связать 2. После закрытия браузера информация о сеансе исчезает, но файл 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

Каким образом можно получить старую информацию о сеансе после закрытия браузера, возможно ли это вообще?

Ответы [ 4 ]

4 голосов
/ 05 августа 2017

Принятый ответ здесь не должен быть принят. Вы наверняка сможете восстановить сеанс, если он еще не очищен. Это действительно так просто.

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

Я нашел ответ здесь .

4 голосов
/ 13 января 2012

Сессия делает именно то, что говорит на банке - существует на время сеанса клиента. Сеанс просмотра по определению (например, один) заканчивается при закрытии браузера.

Сеансы на основе файлов cookie работают путем установки файла cookie, срок жизни которого определен в PHP как 0 - это означает, что браузер должен уничтожить файл cookie, когда браузер закрыт. После того как cookie был уничтожен, идентификатор сеанса не отправляется ни в каких последующих запросах к серверу, поэтому данные сеанса не будут доступны в вашем сценарии PHP.

Однако данные сеанса не уничтожаются на стороне сервера в тот момент, когда пользователь закрывает браузер, как вы предложили, - это невозможно, поскольку клиент не уведомляет сервер о том, что он был закрыт. Вместо этого данные сеанса на стороне сервера имеют TTL (время жизни), значение по умолчанию которого составляет 15 минут. По истечении этого срока данные могут быть в любое время удалены сессионным сборщиком мусора. Теоретически это может занять некоторое значительное время, но на практике на занятом сервере данные будут удалены в течение пары минут после истечения срока действия TTL.

Однако PHP не может сделать данные сеанса доступными, если у него нет идентификатора сеанса, и он не будет иметь идентификатора сеанса, если cookie был уничтожен, что, как я говорю, должно произойти, когда пользователь закрывает свой браузер.

Итак, краткий ответ на вопрос How can I restore a PHP session?: Вы не можете

2 голосов
/ 13 января 2012

Это может быть, а может и не быть ответом, который вы ищете.

Насколько я знаю, вы не можете "восстановить" сеанс, основываясь на файле cookie сеанса.Что я делаю, так это сохраняю cookie с идентификатором клиента, именем пользователя и паролем, с солью и хэшем.Я также храню другой с их идентификатором.Я проверяю оба куки при посещении сайта, затем проверяю их друг против друга, затем автоматически регистрирую их.Хотя это не «восстанавливает» их сеанс, оно позволяет им оставаться в системе на моем сайте, когда они закрывают браузер.Именно так я и собирался это сделать, и я полагаю, что если кто-то взломает или просмотрит куки другого пользователя, будет практически невозможно расшифровать с помощью соли, которую я использовал.Единственная информация, которую они получат, это идентификатор пользователя.

1 голос
/ 13 января 2012

session_start устанавливает cookie.

cookie имеет параметр cookie-life

, по умолчанию время жизни cookie установлено на 0

0 означает, пока браузер не будет закрыт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...