Проверка на сеанс PHP без запуска?
Можно ли проверить сеанс без запуска?
Причина, о которой я прошу, - приложение, которое я разрабатываю, имеет интегрированный интерфейс администратора. Поэтому, когда администратор регистрируется, они просматривают те же страницы, что и пользователи, для внесения изменений. Поля и параметры отображаются на основе пользовательских привилегий.
Это вызывает две проблемы.
Один. Поскольку сеанс запущен, я не могу включить функции кеширования браузера, поскольку отправляемые заголовки всегда:
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Я использую smarty для вывода шаблонов и не могу реализовать:
$smarty->cache_modified_check = true;
отправить 304, не измененный, поскольку сеанс уже запущен. Использование вышеуказанного smarty param было бы идеальным решением для кеширования браузера для меня.
Два - это то, что каждый пользователь, использующий сайт, запускает сеанс, сеансовый каталог заполняется ненужными сеансами.
Я мог бы просто уничтожить сеанс, если пользователь не вошел в систему, но затем каждую загрузку одной страницы, пользователь будет создавать и удалять сеанс. Это плохая практика?
Итак, если бы я мог просто проверить, существует ли активный сеанс без запуска, все мои проблемы будут решены. Есть идеи? Не отправляет ли браузер cookie сеанса при запросе страницы?
Что-то в идеале:
if (session_exists) {
session_start();
$users->priv = $_SESSION['priv'];
}
else {
$users->priv = guest;
}
--------------- В ответ на Тони Миллера ---------------
При использовании session_id() у вас уже должен быть сеанс, чтобы он возвращал идентификатор.
session_start();
echo session_id($_SESSION);
или вы можете установить идентификатор для сеанса перед началом сеанса сеанса
session_id("adfasdf");
session_start();
echo session_id($_SESSION);
//prints "adfasdf"
Ни один из них не помогает мне. Если я что-то не хватает.
Ответы
Ответ 1
Вам бы хотелось session_id()
, который возвращает пустую строку, если сеанс не определен.
Документация указывает, что пустая строка (которая не является "ничего" ) возвращается, если сеанс не запущен.
Как указано в комментариях 2014 года (я написал этот ответ в 2009 году), существует вероятность, что сеанс может начаться, если есть куки файл с сохраненным в нем идентификатором сеанса, который может быть выбран session_start().
Начиная с PHP 5.4.0, теперь мы имеем session_status(), но этого не было в 2009 году.
Ответ 2
Вы можете проверить, установлен ли файл cookie PHPSESSID (имя PHPSESSID может иметь другое имя, в зависимости от настроек вашего сервера, отметьте ini.session.name).
Но если все, что вы боитесь, это ваш сеанс, вы можете настроить session.gc_probability, session.gc_divisor и session.gc_maxlifetime, чтобы ускорить их работу.
Ответ 3
Здесь функция, которая будет делать то, что вы просите, проверяя, существует ли сеанс перед его запуском:
function sessionExists() {
return (isset($_COOKIE[session_name()]));
}
Если вы хотите протестировать его в том же запросе, который вы создали, вы можете сделать это вместо:
function sessionExists() {
return (isset($_SESSION) || isset($_COOKIE[session_name()]));
}