Правильно ли я понял PHP-сессии?
Мне было интересно, как работают сессии внутри, но у меня мало знаний о C (и я не уверен, где искать источник PHP для этого).
Это то, что я понимаю в сеансах на данный момент:
- При запуске сеанса пользователю присваивается идентификатор сеанса, который хранится в файле cookie.
- Когда данные сеанса сохраняются (через
$_SESSION
), они сохраняются в файловой системе с соответствующим идентификатором сеанса и временем истечения срока действия.
Это правильно? Также каков метод, в котором создается идентификатор сеанса? Я предполагаю, что это основано на времени, но что, если два пользователя отправят запрос одновременно? Какие методы существуют внутри, чтобы предотвратить их получение одинакового идентификатора?
Спасибо,
Ответы
Ответ 1
Мое понимание процесса внутренней обработки сеанса заключается в следующем:
Когда вызывается session_start
, PHP ищет параметр от клиента, который был отправлен через POST, GET или в файл cookie (в зависимости от конфигурации, см. session.use_cookies, session.use_only_cookies и session.use_trans_sid) с именем значения session.name, чтобы использовать идентификатор сеанса уже запущенного сеанса.
Если он находит действительный идентификатор сеанса, он пытается извлечь данные сеанса из хранилища (см. session.save_handler) для загрузки данных в $_SESSION
. Если он не может найти идентификатор или его использование запрещено, PHP генерирует новый идентификатор, используя хеш-функцию (см. session.hash_function) по данным источник, который генерирует случайные данные (см. session.entropy_file).
В конце выполнения или при вызове session_write_close
данные сеанса в $_SESSION
хранятся в указанном хранилище.
Ответ 2
Посмотрите на php_session_create_id в ext/session/session.c в источнике php
Это происходит следующим образом:
- получить время суток
- получить удаленный IP-адрес
- постройте строку с секундами и микросекундами с текущего времени вместе с IP-адресом
- передать в сконфигурированную хэш-функцию сеанса (либо MD5, либо SHA1)
- если сконфигурирован, подайте некоторую дополнительную случайность из файла энтропии Сессии и файлы cookie для хорошего праймера.
Ответ 3
Идентификатор сеанса - это, скорее всего, случайная строка букв и цифр. Также было бы странно, если бы PHP не проверял, чтобы он был уникальным и, следовательно, не может быть одинаковым для двух пользователей. Что касается (1) и (2), я бы сказал, что вы правы, но я недавно не работал с PHP, поэтому не стесняйтесь верить мне.