Меню
безкоштовно
Головна  /  Освіта / Де зберігаються сесії php. PHP сесії під скальпелем

Де зберігаються сесії php. PHP сесії під скальпелем

В Інтернеті можна знайти тисячі туторіали про те, що таке сесії, для чого вони потрібні і як з ними працювати. Але, на жаль, прочитавши їх, все одно залишається безліч питань. На мій погляд, найпростіший спосіб розібратися в усьому - це подивитися, як працюють сесії зсередини. Тобто вивчити логи обміну браузера і веб-сервера, а також подивитися, які дані зберігаються на стороні клієнта і на стороні сервера.

Після цього багато моментів стають куди більш зрозумілими, а сам механізм роботи - більш прозорим.

Роботу сесій будемо вивчати на наступному стандартному скрипті:

Він працює таким чином:

Блок 1. Функція session_start () створює нову сесію або завантажує стару, використовуючи унікальний ідентифікатор сесії PHPSESSID.

Блок 2. Якщо вдалося відновити сесію, то значення $ _SESSION [ "views"] збільшується на одиницю. Якщо немає - инициализируется одиницею.

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

Щоб вперше отримати скрипта

заголовки запиту

GET / HTTP / 1.1 Host: firingrange.local User-Agent: Mozilla / 5.0 (Windows NT 5.1; rv: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 Accept: text / html, application / xhtml + xml, application / xml; q \u003d 0.9, * / *; q \u003d 0.8 Accept-Language: ru-ru, ru; q \u003d 0.8, en-us; q \u003d 0.5, en; q \u003d 0.3 Accept-Encoding: gzip, deflate Accept-Charset : windows-1251, utf-8; q \u003d 0.7, *; q \u003d 0.7 Connection: keep-alive Cache-Control: max-age \u003d 0

заголовки відповіді

HTTP / 1.1 200 OK Date: Thu, 29 Sep 2011 20:36:15 GMT Server: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Set-Cookie: PHPSESSID \u003d k33en6ccgcia7125mitj5te4u6; path \u003d / Expires: Thu, 19 Nov одна тисяча дев'ятсот вісімдесят одна 8:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check \u003d 0, pre-check \u003d 0 Pragma: no-cache Content-Length: 58 Keep-Alive: timeout \u003d 5, max \u003d 100 Connection: Keep-Alive Content-Type: text / html

коментар

У вихідному запиті браузер не ідентифікував себе ніяким чином, тому механізм сесій PHP згенерував новий унікальний ідентифікатор сесії і скомандував браузеру створити куку, в якій буде зберігатися цей самий ідентифікатор.

сторона сервера

В результаті роботи скрипта на стороні сервера створюється файл sess_k33en6ccgcia7125mitj5te4u6 такого змісту:

сторона клієнта

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

Примітка. при настройках PHP за замовчуванням, час життя куки PHPSESSID - до закриття браузера. Тобто як тільки браузер буде закритий, кука буде вилучена, а відповідно буде втрачена сесія. Час життя куки PHPSESSID можна змінювати, варіюючи значення session.cookie_lifetime.

Результат роботи скрипта

Друга завантаження скрипта

заголовки запиту

GET / HTTP / 1.1 Host: firingrange.local User-Agent: Mozilla / 5.0 (Windows NT 5.1; rv: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 Accept: text / html, application / xhtml + xml, application / xml; q \u003d 0.9, * / *; q \u003d 0.8 Accept-Language: ru-ru, ru; q \u003d 0.8, en-us; q \u003d 0.5, en; q \u003d 0.3 Accept-Encoding: gzip, deflate Accept-Charset: windows-1251, utf-8; q \u003d 0.7, *; q \u003d 0.7 Connection: keep-alive Cookie: PHPSESSID \u003d k33en6ccgcia7125mitj5te4u6 Cache-Control: max-age \u003d 0

заголовки відповіді

HTTP / 1.1 200 OK Date: Thu, 29 Sep 2011 20:49:41 GMT Server: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Expires: Thu, 19 Nov 1981 8:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check \u003d 0, pre-check \u003d 0 Pragma: no-cache Content-Length: 58 Keep-Alive: timeout \u003d 5, max \u003d 100 Connection: Keep-Alive Content-Type: text / html

коментар

Браузер відправляє веб-сервера куку PHPSESSID, використовуючи яку PHP инициализирует масив $ _SESSION значеннями з файлу sess_k33en6ccgcia7125mitj5te4u6. Відповідно, в блоці 2 відпрацьовує гілка IF (пряма).

сторона сервера

В результаті роботи скрипта вміст файлу sess_k33en6ccgcia7125mitj5te4u6 змінюється:

сторона клієнта

На стороні клієнта нічого не змінюється.

Результат роботи скрипта

Що далі?

Наступні завантаження сторінки до закриття браузера будуть працювати за аналогією з тим, як працювала друга завантаження скрипта.

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

Проте можна повернутися до збереженої сесії, якщо явно вказати PHPSESSID як параметр скрипта:

Повернення до сесії досить умовне, тому що в результаті роботи скрипта в даному випадку Кука не створюється. Заголовки відповіді сервера:

HTTP / 1.1 200 OK Date: Thu, 29 Sep 2011 21:01:52 GMT Server: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Expires: Thu, 19 Nov 1981 8:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check \u003d 0, pre-check \u003d 0 Pragma: no-cache Content-Length: 58 Keep-Alive: timeout \u003d 5, max \u003d 100 Connection: Keep-Alive Content-Type: text / html

Тобто для підтримки роботи саме з цією сесією до всіх посилань доведеться приписувати? PHPSESSID \u003d k33en6ccgcia7125mitj5te4u6.

Примітка. Можна вказати PHP, щоб унікальний ідентифікатор сесії передавався тільки через куку. Для цього потрібно встановити session.use_only_cookies в значення 1. У цьому випадку трюк, продемонстрований вище, не пройде.

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

Невеликий запитальник (FAQ)

Де фізично зберігаються дані сесій?

Дані сесій зберігаються на сервері. За умовчанням вони записуються в файли, але можна поставити свій власний механізм зберігання даних сесій (наприклад з використанням бази даних). Якщо хочете подробиць, дивіться функцію session_set_save_handler.

Хто генерує унікальний ідентифікатор сесії?

Унікальний ідентифікатор сесії (PHPSESSID) генерує сервер.

Чи можна написати власний механізм сесій?

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

Наприклад, власний механізм роботи з сесіями є в популярному фреймворку CodeIgniter.

Наскільки безпечний механізм сесій?

Сесія ідентифікується тільки за допомогою унікального ідентифікатора сесії, тому в загальному випадку зловмисникові досить вкрасти його, щоб заплутати сервер. Візьмемо тестовий скрипт, який ми використовували вище. Якщо звернення до нього буде з іншого IP (по відношенню до створив сесію), але PHPSESSID передаватиметься той же самий, то сесія буде успішно відновлена \u200b\u200bі лічильник буде збільшуватися з попереднього збереженого значення.

забезпечувати додатковий захист доведеться вам самим. наприклад:

  • Можна зберігати в даних сесії IP і User-Agent клієнта (буде зберігатися на стороні сервера), а потім при кожному зверненні перевіряти, що актуальні значення збігаються з збереженими. В даному випадку доводиться шукати компроміс між безпекою та зручністю роботи користувача.

    Наприклад, якщо у користувача динамічний IP і ви використовуєте сесії для підтримки авторизації, але при цьому перевіряєте збіг IP, то при кожній зміні адреси користувачеві доведеться заново вводити логін і пароль.

    Точно також рядок User-Agent може змінюватися при оновленні версії браузера або при установці деяких плагінів.

  • Одним з рекомендованих механізмів захисту сесій є повторна генерація ідентифікатора при кожному зверненні до скрипту (див. Функцію session_regenerate_id). Подивитися скрипт і алгоритм роботи в розрізі можна нижче.

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

Робота сесій з повторною генерацією ідентифікатора в розрізі

скрипт


// блок 1
session_start ();
if(isset($ _SESSION [ "initiated"]))
session_regenerate_id ();
else
$ _SESSION [ "initiated"] \u003d true;

// блок 2
if(isset($ _SESSION [ "views"]))
$ _SESSION [ "views"] ++;
else
$ _SESSION [ "views"] \u003d 1;

// блок 3
echo"
< body>
Кількість переглядів: ". $ _SESSION [" views "]."

" ;

?>

Як вже відомо, протокол HTTP дозволяє веб-додаткам встановлювати "сесії" - діалог між клієнтом і сервером, причому стан цього діалогу зберігається від запиту до запиту.

Мова PHP, будучи в основному мовою для веб-програмування, надає можливість користуватися механізмом сесій HTTP, беручи на себе більшу частину турбот при організації та зберіганні даних сесій. Нагадаю, що необхідно для роботи механізму сесій HTTP:

  • Сервер повинен згенерувати унікальний номер сесії.
  • Номер сесії повинен бути переданий клієнту (зазвичай за допомогою Cookies).
  • Сервер повинен вміти зберігати дані сесії в файлах або в базі даних, так щоб їх можна було відновити, знаючи номер сесії, який клієнт надсилає сервера на випадок повторних запитів (теж за допомогою Cookies).

Власне, єдине заходів, яких треба вжити в програмі на мові програмування PHP, щоб шестерінки механізму сесій закрутилися - викликати одну-єдину функцію: session_start (). Ця функція робить всі необхідні дії:

  • Перевіряє, чи не надіслав клієнт номер вже існуючої сесії в Cookie або в параметрах запиту. Якщо клієнт надіслав номер сесії, то дані цієї сесії завантажуються з місця постійного зберігання (наприклад, файлу) в пам'ять, і стають доступні програмі через масив $ _SESSION. Якщо клієнт не надіслав номера сесії або такої сесії не існує на сервері - створюється нова сесія з новим номером, а її дані також доступні через масив $ _SESSION, який в разі нової сесії буде порожнім. Номер новоствореної сесії поміщається в поле заголовка відповіді сервера Set-Cookie.
  • Забезпечує збереження даних сесії. Після того, як PHP-програма обробила запит, поточний стан масиву $ _SESSION зберігається в місці постійного зберігання, щоб знову стати доступним при наступному запиті клієнта.

Тепер, знаючи подробиці, які ховаються за session_start (), можемо пограти з цим механізмом. Приклад нижче зберігає в сесії одне число, яке збільшується на одиницю з кожним запитом клієнта:

При першому заході на цю сторінку, сервер надішле браузеру куки з номером сесії:

Set-Cookie: PHPSESSID \u003d 4ftvca7jmmnm04q95r3sdsk6r6; path \u003d /

І цей же номер сесії браузер буде відправляти назад сервера при кожному наступному запиті. Тепер, якщо в браузері очистити куки, на сервері буде створена нова сесія з іншим номером, і рахунок в нашому тестовому скрипті почнеться заново.

Більш реальний приклад: логін користувача

Найчастіше сесії використовуються при логін користувача на сайт. При вході на сайт, користувач вводить логін і пароль, які перевіряє сервер. Якщо логін правильний, то сервер повинен запам'ятати дані користувача в сесії, щоб не питати більше логін з паролем. У найпростішому випадку вийде такий приклад:

array ( "password" \u003d\u003e "123", "title" \u003d\u003e "Адміністратор",), "user" \u003d\u003e array ( "password" \u003d\u003e "qwe", "title" \u003d\u003e "Користувач",),) ; return isset ($ users [$ login])? $ Users [$ login]: null; ) Function getCurrentUser () ($ user \u003d isset ($ _ SESSION [ "user"])? $ _SESSION [ "user"]: null; return $ user;) function setCurrentUser ($ user) ($ _SESSION [ "user"] \u003d $ user;)?\u003e

Привіт,!
Ссилка1 Ссилка2

вийти Ви ще не зайшли на сайт. Введіть логін і пароль:
Логін: пароль:

Ця програма запитує логін і пароль, причому можна увійти з логіном user, qwe або admin, 123 . Залогіненним користувачеві показується вітання. При логін відображається повідомлення, якщо ім'я користувача або пароль вказано невірно.

Як тільки вдалося зайти на цей "сайт", можна покликати по посиланнях (Ссилка1, Ссилка2), залишаючись при цьому залогіненним користувачем.

Які дані можна зберігати в сесії?

за замовчуванням PHP зберігає дані сесії в тимчасовому файлі у вигляді тексту. У цьому можна переконатися, заглянувши в директорію з тимчасовими файлами PHP. Ця директорія вказана в phpinfo () в розділі Environment, TEMP. У цій директорії ви знайдете файли виду sess_ 4ftvca7jmmnm04q95r3sdsk6r6, Де 4ftvca7jmmnm04q95r3sdsk6r6 - номер сесії, переданий в Cookie. Загляньте в цей файл: якщо ви запустили найперший приклад вище, то у файлі виявиться приблизно такий вміст: "value | i: 2;". Цей текст являє собою серіалізовані уявлення вмісту сесії, де зберігається всього лише одна змінна з числом.

Всі значення, які PHP-програма поміщає в сесію через масив $ _SESSION, при збереженні сесії перетворюються в текстовий вигляд, а потім записуються в файл. Процес перетворення значень змінних в текст називається "сериализацией". Таким чином, в сесію можна помістити будь-які дані, які PHP здатний серіалізовать.

На щастя, в PHP серіалізовать можна не тільки прості значення зразок чисел і рядків, але так само і складні структури на кшталт масивів і об'єктів:

"; Print_r ($ _ SESSION); echo""; $ _SESSION [" testArray "] \u003d array (1, 2, 3," one "," two "," three "," child "\u003d\u003e array (5, 6, 7),); $ obj \u003d new stdClass (); $ obj-\u003e x \u003d +1234; $ obj-\u003e y \u003d 4567; $ _SESSION [ "testObject"] \u003d $ obj;

Цей приклад запише в файл сесії такі дані:

TestArray | a: 7: (i: 0; i: 1; i: 1; i: 2; i: 2; i: 3; i: 3; s: 3: "one"; i: 4; s: 3 : "two"; i: 5; s: 5: "three"; s: 5: "child"; a: 3: (i: 0; i: 5; i: 1; i: 6; i: 2; i: 7;)) testObject | O: 8: "stdClass": 2: (s: 1: "x"; i: 1234; s: 1: "y"; i: 4567;)

Зберігання об'єктів в сесії

У сесії, як видно, можна зберігати об'єкти. Але при цьому слід пам'ятати, що зберігаючи в сесії об'єкти, що посилаються якимось чином на ваші "саморобні" класи, або об'єкти-екземпляри ваших класів, необхідно, щоб оголошення цих класів робилося до моменту виклику session_start (). Тобто, PHP повинен знати клас до того, як зустріне згадка про нього при десеріалізациі даних сесії.

При збереженні об'єктів бувають ситуації, коли стандартна сериализация об'єкта з яких-небудь причин неприйнятна або зовсім неможлива. У таких випадках можна реалізувати сериализацию вручну, оголосивши в класі "чарівні" методи __sleep () і __wakeup ().

До речі, Сериализацию можливо здійснювати і "вручну", причому не обов'язково для збереження / завантаження даних сесії. Знадобитися це може, коли деякі дані в додатку треба зберегти для використання пізніше, або передати по мережі. Функції, які можуть стати в нагоді при серіалізациі / десеріалізациі - serialize (), unserialize (), json_encode (), json_decode ().

Що не можна зберігати в сесії?

У сесії не можна зберігати те, що не можна серіалізовать. Прикладом такої сутності може служити будь-який ресурс PHP. Ресурси - це мережеві підключення, дескриптори відкритих файлів, підключення до бази даних і деякі інші об'єкти. Ресурс в PHP - це посилання на внутрішній об'єкт в надрах PHP, який не доступний безпосередньо з програми, але з яким можна працювати, викликаючи різні функції PHP. Такий собі "чорний ящик", вміст якого не може і не повинно серіалізовані.

Додаткові можливості

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

Для прискорення процесу збереження і завантаження даних сесії на високо навантажених сайтах може використовуватися сервер Memcached, який зберігає дані в пам'яті. Підтримка цього способу зберігання сесій вбудована в PHP і налаштовується через файл конфігурації php.ini.

Можна задати ім'я параметра Сookie, через який передається номер сесії, вказавши його ім'я, час життя, домен і інші параметри.

Ці та багато інших можливостей настройки сесій HTTP в PHP доступні через функції session_ *.

Сесії в PHP або як дані про зайшов на сайт користувача або покупця зберігаються при переході між сторінками сайту без особливих зусиль. Урок дуже важливий. Актуальний для створення 95% сайтів.

Що таке сесія в php

Сесії використовуються для зберігання відомостей тимчасових даних (наприклад, про те, що користувач зайшов на сайт) при переходах між сторінками одного сайту. При використанні сесій дані зберігаються у тимчасових файлах на сервері.
Найчастіше сесіями (і куками втім теж) користуються при створенні Інтернет-магазинів, форумів, дощок оголошень, соціальних мережах, блогах і інших ресурсах. Зручність системи сесій полягає зберіганні тимчасової інформації зайшов користувача / покупця, дані про який знаходяться в швидкому доступі певний час. У сесії існує звичайно термін придатності - до закриття браузера. Якщо закрити лише сторінку, то при відкритті сайту дані про пользхователе / \u200b\u200bпокупця все одно будуть доступні.

Логіка роботи сесії

Session (або сесія) це якесь тимчасове сховище даних. Відразу попереджаю, зберігати стоїть невеликий обсяг даних. Наприклад, логін і пароль призахідного користувача або його порядковий номер в базі даних.

приклад роботи
1. Користувач вводить логін і пароль і заходить на сайт
2. Дані з логіном і паролем зберігаються в сесії одній зі сторінок сайту:

файл index.php

Session_start (); // кожен файл, в якому Ви хочете використовувати дані сесій повинен на початку коду містити команду "запуску сесії"

$ Login \u003d "admin";
$ Password \u003d "pass";
$ _SESSION [ "login"] \u003d $ login; // зберігаємо змінну містить логін
$ _SESSION [ "password"] \u003d $ password; // зберігаємо змінну містить пароль

3. При переході на іншу сторінку сайту ці дані також будуть доступні:

файл example.php (Або будь-яка інша сторінка)

Echo "Ваш логін". $ _ SESSION [ "login"]; // виведе "Ваш логін admin", хоча на цій сторінці ми не записували даних!
Бачите, все просто!

4. Якщо хочете очистити дані сесії, то досить:

файл example.php

Session_start (); // знову "запускаємо сессіію"

Unset ($ _ SESSION [ "login"]); // так разрегістріровалі змінну або "знищили"
echo "Ваш логін". $ _ SESSION [ "login"]; // виведе "Ваш логін". Так як ми її знищили в минулому рядку, то і даних немає

Session_destroy (); // руйнуємо сесію. Всіх даних, включаючи $ _SESSION [ "password"] вже немає. При їх запиті буде виводити помилка
В цілому подібна передача схожа на метод POST, але тільки Ви вже не повинні писати багато зайвого коду, а всі дані, що передаються від сторінки до сторінки, зберігаються у тимчасових файлах на сервері. Повторюся, сесії повинні містити невеликі обсяги даних, тому вони підходять під зберігання логіна / пароля, кошика покупця і інших невеликих обсягів.

Передача значення або масиву за допомогою сесії PHP

В сесію можна записувати не тільки рядок, а й масив даних. Тільки не перестарайтеся з об'ємом масиву, так як все це вплине на бистройдействіе і зайняте простір на сервері.

Знову використовуємо якусь стартову сторінку index.php

Session_start ();

$ R \u003d array ( "one", "two", "three");

$ _SESSION [ "arr"] \u003d $ r;

На сторінку, де все відобразиться
Зберегли дані в сесії і переходимо по посиланню на іншу сторінку, де все дані і будемо виводити.

Файл одержувач, сторінка test.php де відкриваємо масив

Session_start ();
print_r ($ _ SESSION [ "arr"]);
// виведе
/*
Array
\u003d\u003e One
\u003d\u003e Two
\u003d\u003e Three
*/
?>
Можливо, Ви захочете освіжити в пам'яті урок по. В цілому ж все повинно бути зрозуміло.

Інші функції для роботи з сесіями

session_unregister (string) - сесія забуває значення заданої глобальної змінної;
session_destroy () - сесія знищується (наприклад, якщо користувач покинув систему, натиснувши кнопку вихід);
session_set_cookie_params (int lifetime [, string path [, string domain]]) - за допомогою цієї функції можна встановити, як довго буде жити сесія, задавши unix_timestamp визначає час смерті сесії.

Список функцій для роботи з сесіями (session) в php
session_cache_expire - повертає закінчення дії поточного кеша
session_cache_limiter - отримує і / або встановлює поточний обмежувач кеша
session_commit - псевдонім session_write_close ()
session_decode - декодує дані сесії з рядка
session_destroy - знищує всі дані, зареєстровані для сесії
session_encode - шифрує дані поточної сесії як рядок
session_get_cookie_params - отримує параметри куки сесії
session_id - отримує і / або встановлює поточний session id
session_is_registered - визначає, чи зареєстрована змінна в сесії
session_module_name - отримує і / або встановлює модуль поточної сесії
session_name - отримує і / або встановлює ім'я поточної сесії
session_regenerate_id - модифікує поточний ідентифікатор сеансу недавно згенерував
session_register - реєструє одну або більше змінних для поточної сесії
session_save_path - отримує і / або встановлює шлях збереження поточної сесії
session_set_cookie_params - встановлює параметри куки сесії
session_set_save_handler - встановлює функції зберігання сесії рівня користувача
session_start - ініціалізує дані сесії
session_unregister - дерегістрірует змінну з поточної сесії
session_unset - звільняє всі змінні сесії
session_write_close - записує дані сесії і кінець сесії

Приклади роботи сесій

Лічильник переглядів сторінки під час сесії. Наочно приклад роботи. Однак після закриття браузера відлік почнеться заново.

Лічильник відвідувань однієї сторінки в рамках однієї сесії

// Простий приклад використання сесій без Cookies.
session_name ( "test");
session_start ();
$ _SESSION [ "count"] \u003d @ $ _ SESSION [ "count"] + 1;
?>

Лічильник


У поточній сесії роботи з браузером Ви відкрили цю сторінку
раз (а).
Закрийте браузер, щоб обнулити цей лічильник.
Натисніть сюди для поновлення сторінки!
При кожному переході лічильник буде збільшуватися на 1)

Дякую за увагу! Удачі в починаннях!

Сесії в PHP вдають із себе механізм збереження на стороні сервера інформації про комп'ютер клієнта. Насправді сесії в PHP - це не така складна тема, але для її розуміння потрібно знати принцип роботи cookie в PHP. Так що, якщо ви не знаєте як працюють cookie в PHP, то спочатку читайте відповідну статтю, а потім вже повертайтеся сюди.

Слово session з англійської перекладається як сеанс, так сам сенс сесій в PHP стає більш зрозумілим, але у програмістів прижився термін "сесії", його і ми будемо використовувати в цій статті.

Сесії в PHP дуже схожі на механізм cookie, ті ж самі пари ключ \u003d\u003e значення, тільки вони зберігаються на стороні сервера.

Функція session_start ()

Сеанс нам потрібно почати, для цього існує функція session_start (). Ця функція стартує сеанс, або сесію, як завгодно можна назвати це.

Функція session_start () бажано викликати на самому початку сторінки, але в моїх прикладах я цього не роблю.

Масив $ _SESSION

Сесії - це групи змінних, які зберігаються на сервері, але відносяться до одного унікального відвідувача. Повторю, це ключовий момент: сесії зберігаються на сервері.

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

На сервері дані сесії зберігаються в текстовому файлі і вони доступні в програмі PHP в масиві $ _SESSION. Щоб зберегти змінну в сесії потрібно присвоїти їй значення в цьому масиві.

Давайте нарешті почнемо використовувати приклади. Все дуже просто.

Сесії в PHP значення. ";?\u003e

Тепер спробуємо отримати значення з масиву $ _SESSION в іншому прикладі.

Сесії в PHP

Зверніть увагу, якщо в другому прикладі ми видалимо функцію session_start () то у нас не буде доступу до даних масиву $ _SESSION.

Функція session_id ()

Після того, як сесія створена, ви автоматично отримуєте доступ до унікальноми ідентифікатором сесії за допомогою функції session_id (). Ця функція дозволяє як ставити, так і отримувати значення ідентифікатора сесії.

Сесії в PHP

Можете подивитися в панелі інструментів для розробників вашого браузера (в Chrome для цього натисніть Ctrl + Shift + I, потім Resources, і там знайдете cookie), цей домен поклав вашому браузеру cookie з ім'ям PHPSESSID і приблизно таким значенням: "7g5df9rkd1hhvr33lq1k6c72p7".

Саме за значенням PHPSESSID сервер буде визначати ваш браузер і працювати з відповідним набором змінних, які будуть доступні скрипту через масив $ _SESSION, як вже писалося раніше.

Функція session_name ()

Якщо функції session_id () дозволяє отримувати значення ідентифікатора сесії, функція session_name () дозволяє дізнатися ім'я сесії.

Сесії в PHP

Ще раз про функцію session_start ()

Тепер ми знаємо більше про мешанізм роботи сесій в PHP і потрібно ще раз повернутися до функції session_start (). Ця функція ініціалізує механізм сесій для поточного користувача. Як саме це відбувається:

  • Якщо користувач запустив сайт вперше, то session_start () встановлює cookie у клієнта і створює тимчасове сховище на сервері, пов'язане з ідентифікатором користувача.
  • Визначає сховище, пов'язане з переданим поточним ідентифікатором.
  • Якщо в сховище на сервері є дані, вони поміщаються в масив $ _SESSION.
  • Якщо register_globals з файлу php.ini дорівнює On, то всі елементи масиву $ _SESSION перетворюються в глобальні змінні.

Приклад використання сесії

Зараз ми розглянемо приклад, який дозволить провести невеликі експерименти з сесіями.

Сесії в PHP

Лічильник

У поточній сесії ви відкрили сторінку раз.

Відкрити приклад в "\u003e цій вкладці.

Вся робота сесій заснована на масиві $ _SESSION, це добре видно в даному прикладі.

Якщо закрити вікно браузера, то сесія припиниться, наш лічильник обнулится. Така поведінка сесій в PHP можна змінити, до цього питання ми повернемося трохи далі в статті.

завершення сесії

Для того, щоб завершити сесію нам потрібно:

  1. Очистити масив $ _SESSION.
  2. Видалити тимчасове сховище на сервері.
  3. Видалити сесійний cookie.

Очистити масив $ _SESSION можна за допомогою функції session_unset ().

Функція session_destroy () видаляє тимчасове сховище на сервері. До речі, вона більше нічого не робить.

Видалити сесійний cookie потрібно за допомогою функції setcookie (), яку ми вивчили в уроці робота з cookie в PHP.

Приклад завершення сесії:

завершення сесії

Сесія завершена.

Тепер можете провести експеримент: запустити в одному вікні приклад з лічильником, накрутити лічильник, а потім запустити приклад з видаленням сесії і знову відновити сторінку із лічильником.

Видалення файлу cookies можна зробити так:

setcookie (session_name (), "", time () - 60 * 60 * 24 * 32, "/")

Ще раз про функції session_name () і session_id ()

Функції session_name () і session_id () на практиці використовуються рідко, але я про них пишу, так як в статті потрібно розкрити сам механізм роботи сесій в PHP.

За допомогою цих функцій можна ставити власні імена і ідентифікатори сесій, але робити це не рекомендується. Якщо ви захотіли поставити їх, то пропишіть ці функції з аргументами перед функцією session_start (), як в прикладі нижче:

Сесії в PHP

При використанні даного прикладу всім користувачам буде призначений один і той же ідентифікатор сесії.

Тут детальніше зупинимося, якщо ви запустите приклад з секції про функцію session_name () (ось посилання) в різних браузерах (наприклад в Chrome і в Internet Explorer), то в кожному браузері буде свій, унікальний ідентифікатор сесії. Браузери зберігають файли cookies кожен у своїй папці, тому функція session_start () дасть кожному браузеру створити свій, унікальний ідентифікатор і, відповідно, для кожного браузера буде створено унікальне сховище на сервері. Тому приклад з лічильником (цей) в кожному браузері буде працювати незалежно один від одного.

Якщо задати однаковий ідентифікатор сесії для всіх користувачів, то вони будуть працювати з одним сховищем на сервері. Ось приклад лічильника, який буде вважати відвідування з різних браузерів:

100) (session_unset (); session_destroy ();)?\u003e Сесії в PHP

Лічильник №2

Відкрили сторінку в різних браузерах раз.

Відкрити приклад в "\u003e цій вкладці.

Якщо ви запустите цей приклад, то не факт що ви побачите там одиницю. Інші відвідувачі могли вже змінити значення в сховище сесій на сервері. Коли в цьому випадку сервер видаляє сховище - я не знаю, тому при перевищенні лічильником значення 100 буду завершувати сесію.

Установка часу очікування

За замовчуванням, сесія "живе" до тих пір, поки відвідувач не закриє вікно браузера. Це обумовлено тим, що функція session_start () покладає клієнту такий cookie.

Час життя сесії можна змінити за допомогою функції session_set_cookie_params (), ось її синтаксис.

session_set_cookie_params (int lifetime [, string path [, string domain [, bool secure]]])

На практиці досить використовувати тільки перший параметр (lifetime), сюди записуєте час в секундах, що визначає скільки сервер повинен пам'ятати стан сесії після закриття браузера.

Дія функції session_set_cookie_params () поширюється тільки на період роботи скрипта.

Ось приклад використання цієї функції:

Сесії в PHP

Лічильник №3

Значення лічильника:.

Відкрити лічильник в "\u003e цій вкладці.

Накрутите лічильник і закрийте браузер, через 30 сукунд знову відкрийте цей приклад. Ваша сесія збережеться.