PHP Session: проверка без запуска - PullRequest
2 голосов
/ 24 октября 2019

Можно ли проверить, существует ли определенный идентификатор сеанса, не запуская новый?

Причины, по которым я спрашиваю это:

  1. Если каждый пользовательДля входа в систему для входа на сайт не требуется session_start(), вскоре папка сеанса будет раздута ненужными файлами (даже если сборщик мусора удаляет устаревшие сеансы).
    Конечно, это можно устранить, уничтожив сеансы таких пользователей. Однако в этом случае кажется, что создание и уничтожение файлов может потребовать дополнительных затрат (если только PHP не достаточно умен, чтобы отменить эти операции). Это плохая практика?

  2. Если пользователь просто гость и не требует сеанса, нет необходимости создавать его для него.

Идеальные решения:

if( session_exist($_COOKIE['PHPSESSID']) )
{
    session_start();
}

Или:

session_start(RESUME_ONLY);


Продолжение

Существует пакет PHP, который намного лучше объясняет вышеупомянутую проблему. Вкратце, некоторые интересные выдержки:

Возобновление сеанса
[...]
Вы можете начать новый сеанс самостоятельно, чтобы заполнить $_SESSION, ноэто приведет к снижению производительности, если вам не нужны данные сеанса. Точно так же может не потребоваться запускать сеанс, если ранее сеанса не было (и, следовательно, нет данных для повторного заполнения в $_SESSION). Нам нужен способ начать сеанс, если он был запущен ранее, но избегать запуска сеанса, если ни один не был запущен ранее.
[...]
Если файл cookie отсутствует, он не запуститсеанс и вернуться к вызывающему коду. Это позволяет избежать начала сеанса, когда нет данных для заполнения $_SESSION.

Источник: Aura.Auth

Примечания:

Этот вопрос был изначально опубликован как Проверка сеанса PHP без его запуска? .
Однако, IMO, ни один из ответов не решил должным образом проблему.

1 Ответ

0 голосов
/ 24 октября 2019

Я думаю, что вы пытаетесь решить не ту проблему здесь. Чтобы ответить на ваш вопрос, нет, вы должны использовать session_start перед выполнением операций сеанса. Вы также можете уничтожить сеанс, если он не нужен в том же запросе с session_destroy .

Вы можете обойти проблему session_start с некоторыми умными вариантами хранения сеанса, но я думаю, что этопросто неправильный ответ на вашу проблему. Размер сессий, хранящихся на ФС, действительно незначителен, если объем занимаемой вами установки серверов составляет не менее 8 ГБ. Кроме того, местом хранения сеанса по умолчанию является / tmp, который обычно устанавливается как ramfs, чтобы избежать любых дисковых накладных расходов. Если вы работаете с ограничениями хранилища сессий FS, вам, вероятно, нужно использовать другой SessionHandler , такой как memcached , не беспокоясь о том, нужно ли вам начинать сеанс. На связанной ноте прекратите преждевременную оптимизацию вашего кода. Хранение сеансов не будет проблемой, пока вам не понадобится более одного сервера. В действительности будет гораздо больше запросов к базе данных, которые выиграют от дополнительного индекса, чем неясные оптимизации, подобные этой.

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