PHP сесії під скальпелем. Як працюють PHP сесії зсередини

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

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

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

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

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

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

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

Set-Cookie: PHPSESSID=4ftvca7jmmnm04q95r3sdsk6r6; path=/

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

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

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

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

Вітання,!
Посилання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"] = array(1, 2, 3, "one", "two", "three", "child" => array(5, 6, 7),); $obj = new stdClass(); $obj->x = 1234; $obj->y = 4567;

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

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.

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

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

//Очистити дані сесії для поточного сценарію: $_SESSION =; //Видалити cookie, що відповідає id: @unset($_COOKIE); //видалити сховище сесії: session_destroy();

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

Для наочності визначимо всі місця, де зберігаються всілякі дані про сесію:

  1. Суперглобальний масив $_SESSION.
    Створюється під час старту сесії session_start(). Це лише змінна скрипта, яка доступна лише протягом роботи скрипта і НЕ зберігається в сховищі на сервері, а зберігається в оперативній пам'яті (а значить зникає після чергового виконання скрипту, ініціалізуючись знову зі сховища при черговому зверненні до сервера).

    У Котерова:

    Після завершення сценарію PHP автоматично зберігає масив $_SESSION у тимчасовому сховищі, ім'я якого зберігається у SID

    мається на увазі, що в сховищі записуються дані з масиву $_SESSIONякщо такі в ньому є.

  2. Кука SID.
    Створюється під час старту сесії session_start(). Зберігає дані про розташування сховища даних про сесію даного користувача. Видаляється тільки при примусовому чищенні куків.
  3. І наостанок, Сховище даних сесії.
    Створюється під час старту сесії викликом функції session_start(). Сховище розташовується на сервері (там, де працює ваш php скрипт).
    До нього записуються дані з масиву $_SESSIONякщо вони там є/з'являються. Видаляються дані з нього лише за виклику session_destroy().
    Дане сховище продовжує існувати на сервері навіть по тому, як черговий запит від користувача отримав відповідь, тобто. скрипт завершив свою роботу.

Тобто. можна сказати що:

  • У php-скрипті працювати з даними сесії можна через масив $_SESSION
  • $_SESSIONє "маскою" для сховища сесії і хоча запис у цей масив призводить до запису в сховище, видалення масиву саме по собі не знищує дані в сховищі.
  • Видаливши масив, ви втратите доступ до даних сесії тільки в поточному виклику скрипта, але в наступному він буде знову ініцілізований (повстане з попелу), якщо додатково не очистити сховище.

Таким чином

Якщо session_destroy()не буде викликано, і не буде очищено куки, то при новому запуску скрипту, дані зі сховища, записані в нього раніше, з'являться в $_SESSION, навіть якщо при цьому запуску скрипта вручну в $_SESSIONви їх не додасте.

// Цей рядок пишемо, щоб очистити дані про сесію в поточному запуску скрипта $_SESSION = ; //Цей рядок видаляє SID @unset($_COOKIE); //Видаляє сховище сесії: session_destroy();

З самого початку PHP всі прийняли на ура, але як тільки цією мовою стали створювати досить великі проекти, розробники зіткнулися з новою проблемою - у PHP не було поняття глобальних змінних! Тобто виконувався якийсь скрипт, посилав згенеровану сторінку клієнту, і всі ресурси, що використовуються цим скриптом, знищувалися. Спробую проілюструвати: припустимо, є дві сторінки одного сайту, index.php і dothings.php. Вихідники до цих сторінок виглядають так:

index.php dothings.php

Якщо виконати ці два скрипти, то на першій сторінці ми побачимо напис "Мене задали на index.php", а друга сторінка буде порожньою.

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

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

Як працювати із сесіями?

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

"Warning: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) сказано: No such file or directory (2)".

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

Будь-який скрипт, який використовуватиме змінні (дані) із сесій, повинен містити наступний рядок:

Session_start();

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

Session_start(); ?> ... Для завдання директорії, в якій будуть зберігатися файли сесій, використовується функція session_save_path() : session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); session_start();

Після початку сесії можна ставити глобальні змінні. Арі присвоєння будь-якого значення будь-якому полю масиву $_SESSION, змінна з таким же ім'ям автоматично реєструється, як змінна сесії. Цей масив доступний на всіх сторінках, які використовують сесію. Наприклад розберемо програму:

index.php Все ОК. Сесію завантажили! Пройдемо, подивимося що там:

dothings.php

При послідовному запуску цих файлів перший скрипт "index.php" видасть наступний результат:

Все ОК. Сесію завантажили! Пройдемо, подивимося що там:

А другий "dothings.php" ось це:

Мене поставили на index.php

Змінна $a тепер доступна на всіх сторінках сайту, які запустили сесії.

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

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

Приклади

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

Авторизація Користувача

Питання авторизації користувачів за допомогою PHP-сесій постійно задаються в конференціях з web-програмування. Механізм авторизації користувачів у системі з допомогою сесій досить непоганий з погляду безпеки (див. розділ ).

Наш приклад складатиметься з трьох файлів: index.php, authorize.php та secretplace.php. Файл index.php містить форму, де користувач введе свій логін та пароль. Ця форма передасть дані файлу authorize.php, який у разі успішної авторизації допустить користувача до файлу secretplace.php, а в іншому випадку видасть повідомлення про помилку.

Приклади: index.php Вводь пароль

Логін:
Пароль:


authorize.php сторінку... header("Location: secretplace.php"); exit; ) ) // якщо щось було не так, то користувач отримає // повідомлення про помилку. ?> Ви ввели неправильний пароль!

secretplace.php Вітання,, Ти на секретній сторінці! :)

Безпека

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

  • на комп'ютері користувача стоїть "троян", який краде номери сесій;
  • зловмисник відловлює трафік між комп'ютером користувача та сервером. Звичайно, є захищений (зашифрований) протокол SSL, але ним користуються не всі;
  • до комп'ютера нашого користувача підійшов сусід і стягнув номер сесії.

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

Втім, PHP дуже часто можна "обдурити". Давайте розглянемо можливі точки злому у програмі авторизації користувача:

  • Файл authorize.php – спроба підбору пароля за допомогою стороннього скрипта;
  • Файл secretplace.php - спроба обдурити програму шляхом вписування значень змінної $logged_user в адресному рядку браузера, наприклад:
    "http://www.yoursite.ru/secretplace.php? logged_user=hacker"

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

Як "залатати" дірку номер 1?

Не будемо писати тонни коду з блокування IP-адреси і т.п., а просто перевіримо, звідки надходить запит, а точніше з якої сторінки прийшов запит, якщо це буде будь-яка сторінка з нашого сайту, то все нормально, а в інших випадках пускати не будемо. Підкоригуємо файл authorize.php:

authorize.php V2 сторінку... header("Location: secretplace.php"); exit; ) ) ) ?> Ви ввели неправильний пароль!


Як позбутися "дірки" номер 2?

Припустимо, у вас є сайт, де кожен смертний може зареєструватися, щоб додавати повідомлення у форум. Звичайно, у форумі у деяких користувачів (адмінів, модераторів), можливостей більше, ніж у інших, вони, наприклад, можуть видаляти повідомлення інших користувачів. Рівень доступу користувача ви зберігаєте у сесії, у змінній $user_status, де $user_status = 10 відповідає повному доступу до системи. Зловмиснику, який прийшов на сайт, достатньо зареєструватися штатним чином, а потім дописати в адресному рядку браузера ?user_status=10. Ось і завівся у вас на форумі новий адмін!

В принципі, будь-яку змінну скрипта можна задати через адресний рядок, просто дописавши після повної адреси до скрипта знак питання і назву змінної з її значенням. Давайте поправимо наш код, щоб цього уникнути:

secretplace.php V2 змінну unset($_SESSION["logged_user"]); // відкриваємо сесію session_start(); /* просто зайти на цю сторінку не можна... якщо ім'я користувача не зареєстроване, то перенаправляємо його на сторінку index.php для введення логіну та пароля... тут насправді можна багато чого зробити, наприклад запам'ятати IP користувача, і після третьої спроби отримати доступ до файлів, перекрити його. */ if(!isset($_SESSION["logged_user"]))( header("Location: index.php"); exit; ) ?> Вітання,, Ти на секретній сторінці!

Підсумки

Механізм сесій – досить вдала особливість мови PHP. Сесії прості, дуже гнучкі у використанні. До речі, є одна, де документована можливість сесій PHP (доступна починаючи з версії 4.0.3) - в сесіях можна зберігати не тільки змінні, але і об'єкти.

Приклади

?>
// Автоматична вставка SID у посилання. ini_set("session.use_trans_sid", true); session_start(); ?> Click here!
Click here!!



// Приклад роботи із сесіями. session_start(); // Якщо на сайт тільки-но зайшли, обнулюємо лічильник. if (!isset($_SESSION["count"])) $_SESSION["count"] = 0; // Збільшуємо лічильник у сесії. $_SESSION["count"] = $_SESSION["count"] + 1; ?>

Лічильник

раз(и).
Закрийте браузер, щоб обнулити лічильник.
" target="_blank"> Відкрити дочірнє вікно браузера.
// Простий приклад використання сесій без Cookies. session_name("test"); session_start(); $_SESSION["count"] = @$_SESSION["count"] + 1; ?>

Лічильник

У поточній сесії роботи з браузером Ви відкрили цю сторінкураз(и).
Закрийте браузер, щоб обнулити цей лічильник.
?">Натисніть сюди, щоб оновити сторінку!"

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

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

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

Функція session_start()

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

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

Масив $_SESSION

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

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

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

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

Сесії у PHP значення."; ?>

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

Сесії у PHP

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

Функція session_id()

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

Сесії у PHP

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

Саме за значенням 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

Лічильник

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

Відкрити приклад у цій вкладці.

Вся робота сесій заснована на масиві $_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(); ) ?> Сесії у PHP

Лічильник №2

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

Відкрити приклад у цій вкладці.

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

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

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

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



Подібні публікації