Як працюють сеанси PHP? (а не "як вони використовуються?")


127

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

Визначення імені змінної та змісту з файлу легко. Але як PHP знає, яка сесія належить кому?

Сесія_id видається абсолютно випадковою, і одна IP-адреса може мати декількох користувачів, і кожен користувач може мати кілька сеансів, якщо у них відкрито більше одного вікна браузера.

То як це працює?


Відповіді:


202

У загальній ситуації:

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

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


Іноді ідентифікатор сеансу не зберігається у файлі cookie, а надсилається і в URL-адресах - але це досить рідко.


Для отримання додаткової інформації ви можете ознайомитись з розділом "Посібник із сеансом " цього посібника, який дає корисну інформацію.

Наприклад, є сторінка про передачу ідентифікатора сесії , де пояснюється, як ідентифікатор сеансу передається зі сторінки на сторінку, використовуючи файли cookie або URL-адреси - і які параметри конфігурації впливають на це.


5
Як мобільний пристрій (із нативного додатка) нормально обробляє сеанси? Збереження ідентифікатора сеансу? Або це був OAuth?
Адам Уейт

13

Як працює сесія PHP

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

  • Файл cookie PHPSESSID передає цей унікальний ідентифікаційний номер браузеру користувачів, щоб зберегти це число.

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

  • Браузер надсилає цей cookie на сервер із кожним запитом.

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

Сеанс знищується, коли користувач закриває веб-переглядач або покидає сайт. Сервер також припиняє сеанс після закінчення заздалегідь визначеного періоду сеансу. Це прості дії механізму, які PHP використовує для обробки сеансу. Я сподіваюся, що ця стаття допоможе вам зрозуміти, як працює PHP SESSION.

Дивіться цю статтю для більш детальної інформації. Як працює сесія PHP


Але якщо я, скажімо, увійшов на певний сайт (він же: під час сеансу) і відкрию нову вкладку mysite.com/cart. Я також отримаю своє "Hello Joe Doe, 5 повідомлень, ось ваш список кошиків для покупок ...", також інформацію про сеанс. - Але чому б браузер щодо цієї пустої вкладки надсилав ідентифікатор сесії поряд із GET-запитом? швидке оновлення: Ах, знайшов відповідь: +)
Френк Нокк

Чи можу я запитати, як ідентифікатор сеансу може забезпечити безпеку? Наприклад, якщо користувач ввійшов і перейшов до свого профілю, ніж змінити параметр URL для доступу до профілю іншого користувача, як ідентифікатор сеансу може запобігти цьому?
Andrewboy

4

Ідентифікатор сеансу дійсно випадковий і передається у файлі cookie або в URL-адресі залежно від конфігурації. Можливо, ви вже бачили цей PHPSESSID = xxxx у деяких URL-адресах, також є печиво за цим ім'ям.


2

Сеанси в PHP починаються за допомогою функції session_start (). Як і функція setcookie (), функція session_start () повинна бути перед будь-яким HTML, включаючи порожні рядки, на сторінці. Це буде виглядати приблизно так: <?php session_start( );?><html><head> ....... і т.д. Функція session_start () генерує випадковий ідентифікатор сесії та зберігає його у файлі cookie на комп'ютері користувача (це єдина інформація про сеанс, яка фактично зберігається на стороні клієнта. ) Ім'я файлу cookie за замовчуванням - PHPSESSID, хоча це можна змінити у файлах конфігурації PHP на сервері (більшість хостинг-компаній залишать його в спокої. Однак, щоб посилатись на Ідентифікатор сеансу у вашому PHP-коді, ви б посилалися на змінна $ PHPSESSID (це ім'я файлу cookie; пам'ятаєте, що з Cookies?)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.