Первоначально я придумал следующее, чтобы проверить, вошел ли пользователь в систему:
<?php
session_start();
if(!isset($_SESSION['sessionid'])) {
header("Location: login_form.php");
} else {
echo "You are logged in";
}
?>
$_SESSION['sessionid']
устанавливается, когда пользователь входит в систему вручную.
Если пользователь проверяет «запомни меня», я устанавливаю время жизни cookie сеанса равным 10 годам:
$lifetime = 24*60*60*365*10; // 10 years
setcookie(session_name(),session_id(),time()+ $lifetime,'/');
Так что теперь мне нужно выяснить, что делать на стороне сервера .... Изначально я думал о том, чтобы установить для session.gc_maxlifetime высокое значение, чтобы данные сеанса сервера сохранялись долгое время, но 10 лет. было бы смешно Теперь я думаю, что я должен сохранить идентификатор сеанса в пользовательской таблице и запросить его по идентификатору сеанса. Если есть совпадение, я автоматически войду в систему.
Мой вопрос:
Как получить идентификатор сеанса от клиента?
Насколько я понимаю, он будет доступен после того, как я вызову session_start (), но только если данные сеанса на сервере все еще доступны. Если сеанс истек (что происходит в зависимости от значения session.gc_maxlifetime), новый идентификатор сеанса будет сгенерирован при вызове session_start (). Это было бы проблематично, так как оно не соответствовало бы последнему идентификатору сеанса, который я сохранил в пользовательской таблице.
Итак, после вызова session_start () я должен прочитать идентификатор сессии:
1) $_SESSION['sessionid']
2) $id = session_id();
3) $_COOKIE["PHPSESSID"];
1 и 2 не будут работать, если сервер уничтожил данные сеанса, поэтому я не думаю, что смогу их использовать.
3 может работать, но когда я попробовал (echo $_COOKIE["PHPSESSID"];
), я был удивлен, потому что идентификатор сеанса появился дважды:
вывод был такой:
htknitopug4b6bv4ql9050pfg6 //htknitopug4b6bv4ql9050pfg6
Я просто ожидал, что результат будет htknitopug4b6bv4ql9050pfg6.
Может кто-нибудь объяснить дубликат записи идентификатора сеанса? Если это поведение соответствует, я всегда могу прочитать первую строку в моей таблице базы данных.