Правильно ли я понял 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, поэтому не стесняйтесь верить мне.