Как работают сеансы PHP? (а не «как они используются?»)


127

Файлы сеанса обычно хранятся, скажем, /tmp/на сервере и имеют имена sess_{session_id}. Я просматривал содержимое и не могу понять, как они на самом деле работают.

Получить имя переменной и содержимое из файла очень просто. Но как PHP узнает, какая сессия кому принадлежит?

Session_id кажется совершенно случайным, и один IP-адрес может иметь несколько пользователей, и каждый пользователь может иметь несколько сеансов, если у них открыто более одного окна браузера.

Итак, как это работает?


Ответы:


203

В общей ситуации:

  • идентификатор сеанса отправляется пользователю при создании его сеанса.
  • он хранится в файле cookie (по умолчанию называется PHPSESSID)
  • этот файл cookie отправляется браузером на сервер с каждым запросом
  • сервер (PHP) использует этот файл cookie, содержащий session_id, чтобы узнать, какой файл соответствует этому пользователю.

Данные в файлах сеансов - это содержимое $_SESSION, сериализованное (т. Е. Представленное в виде строки с такой функцией, как сериализация ) ; и не сериализуется, когда файл загружается PHP, чтобы заполнить$_SESSION массив.


Иногда идентификатор сеанса не сохраняется в файле cookie, но также отправляется в URL-адресах, но в настоящее время это довольно редко.


Для получения дополнительной информации вы можете взглянуть на раздел руководства « Обработка сеанса» , который дает некоторую полезную информацию.

Например, есть страница о передаче идентификатора сеанса , в которой объясняется, как идентификатор сеанса передается со страницы на страницу, с помощью файла cookie или в URL-адресах - и какие параметры конфигурации влияют на это.


5
Как мобильное устройство (из собственного приложения) обычно обрабатывает сеансы? Сохранение идентификатора сеанса? Или это был OAuth?
Адам Уэйт,

14

Как работает сеанс PHP

  • Во-первых, PHP создает уникальный идентификационный номер длиной 16 байт (хранящийся, например, в виде строки из 32 шестнадцатеричных символов a86b10aeb5cd56434f8691799b1d9360) для отдельного сеанса.

  • Файл cookie PHPSESSID передает этот уникальный идентификационный номер в браузер пользователя, чтобы сохранить этот номер.

  • Новый файл создается на сервере с таким же именем уникального идентификационного номера с sess_ префиксом (т.е. sess_a86b10aeb5cd56434f8691799b1d9360) .

  • Браузер отправляет этот файл cookie на сервер с каждым запросом.

  • Если PHP получает этот уникальный идентификационный номер из файла cookie PHPSESSID (при каждом запросе), то PHP выполняет поиск во временном каталоге и сравнивает этот номер с именем файла. Если оба они одинаковы, он извлекает существующий сеанс, в противном случае он создает новый сеанс для этого пользователя.

Сеанс уничтожается, когда пользователь закрывает браузер или покидает сайт. Сервер также завершает сеанс после истечения заранее определенного периода времени сеанса. Это простые шаги механизма, которые PHP использует для обработки сеанса. Надеюсь, эта статья поможет вам понять, как работает PHP SESSION.

См. Эту статью для получения более подробной информации. Как работает сеанс PHP


Но если я, скажем, вошел в систему на определенном сайте (он же: в сеансе) и открываю новую вкладку mysite.com/cart. Я также получу свое «Привет, Джо Доу, 5 сообщений, вот список твоей корзины…», также известная как информация о сеансе. - Но почему браузер в отношении этой пустой вкладки должен отправлять какой-либо Session-ID вместе с GET-запросом? быстрое обновление: Ах, нашел ответ: +)
Фрэнк Нок

Могу ли я спросить, как идентификатор сеанса может обеспечить безопасность? Например, если пользователь вошел в журнал и заходит в свой профиль, чем изменить параметр url для доступа к профилю другого пользователя, как идентификатор сеанса может предотвратить это?
Andrewboy

4

Идентификатор сеанса действительно случайный и передается в файле cookie или в URL-адресе, в зависимости от конфигурации. Возможно, вы уже видели этот PHPSESSID = xxxx в некоторых URL-адресах, есть файл cookie с таким именем.


2

Сеансы в PHP запускаются с помощью функции session_start (). Как и функция setcookie (), функция session_start () должна стоять перед любым HTML, включая пустые строки, на странице. Это будет выглядеть так: <?php session_start( );?><html><head> ....... и т. Д. Функция session_start () генерирует случайный идентификатор сеанса и сохраняет его в файле cookie на компьютере пользователя (это единственная информация о сеансе, которая фактически сохраняется на стороне клиента. ) Имя по умолчанию для файла cookie - PHPSESSID, хотя его можно изменить в файлах конфигурации PHP на сервере (однако большинство хостинговых компаний оставляют его в покое). Чтобы ссылаться на идентификатор сеанса в вашем PHP-коде, вы должны поэтому ссылаться на переменная $ PHPSESSID (это имя файла cookie; помните это из файлов cookie?)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.