Проверка на сеанс 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()]));
}