Створення і використання сесійних змінних
Управління сесіями.
Сесії в PHP
Сесії - це механізм, який дозволить вам створювати і використовувати змінні, що зберігають своє значення протягом всього часу роботи користувача з вашим сайтом. При цьому у кожного користувача вашого сайту ці змінні будуть власними, тобто їх зона видимості (variable scope) поширюється на весь час знаходження на сайті конкретного користувача, причому для кожного заходу користувача на ваш сайт ці змінні будуть різними. Кажучи простіше, ці змінні належать конкретній сесії роботи конкретного користувача з вашим сайтом (звідси і назва механізму - сесії).
Для того, щоб зрозуміти всю важливість цього механізму необхідно розуміти відмінність в принципах побудови звичайних програм, що виконуються на локальній машині користувача і систем "клієнт-сервер", до яких відносяться web-сайты.
Модель "клієнт-сервер"
Суть моделі "клієнт-сервер" полягає в тому, що застосування розділяється на дві частини, відповідно клієнт і сервер. При цьому кожна частина може фізично виконуватися на окремій машині, що дозволяє організовувати системи, розподілені в просторі. У контексті web-сайтов ця системи виглядає таким чином: є web-сервер, на якому розташовується ваш сайт і є машини відвідувачів вашого сайту, які в даній схемі є клієнтами. На приведена схема дії системи "клієнт-сервер" в контексті web-сайта:
Модель "клієнт-сервер". |
Ця схема працює таким чином: користувач, через браузер посилає запит на сервер. На стороні сервера запит приймає програма web-сервера (в більшості випадків - Apache), аналізує запит і, в нашому випадку, викликає PHP для обробки цього запиту. PHP виконує ваш скрипт, завданням якого є генерація сторінки, відповідної отриманому запиту. Після закінчення роботи PHP передає сторінку, що згенерувала, web-серверу, який посилає її назад на машину клієнта як результат обробки його запиту.
Все задоволено просто і зрозуміло, за винятком однієї дрібниці, яка, як завжди, псує всю картину. Як правило, при створенні будь-якого більш-менш складного сайту (за виключенням, може бути лише домашніх сторінок) виникає необхідність в інформації, яка зберігалася б між запитами (наприклад система реєстрації на сайті, коли, після введення логина/пароля необхідно "пам'ятати" інформацію про те, що користувач реєструвався на сайті і є саме цим користувачем, а не якимсь іншим). Проте специфіка роботи систем "клієнт-сервер" полягає в тому, що сервер не розрізняє між собою запити клієнтів. Тобто на приведеному малюнку всі запити, що йдуть зі всіх клієнтів абсолютно рівноцінні. У наявності явне протиріччя, і вирішення цього протиріччя - суть механізму сесій.
Клієнти і сервер. |
У основі всього механізму сесій лежить рішення задачі про ідентифікацію того, від кого саме прийшов запит на сервер. Якщо це буде точно відомо, то вже не виникне великої проблеми в тому, аби надати скрипту інформацію, що відноситься саме до цього конкретного користувача.
Дане завдання вирішується шляхом привласнення кожній сесії унікального ідентифікатора SID (Session IDentifier), який створюється в той момент, коли користувач заходить на сайт, і знищується в мить, коли користувач вирушає з сайту. Він є рядком з 32 символів (наприклад, ac4f4a45bdc893434c95dcaffb1c1811). Цей ідентифікатор передається на сервер разом з кожним запитом клієнта і повертається назад разом з відповіддю сервера. Цей ідентифікатор передається на сервер разом з кожним запитом з боку клієнта і повертається на машину клієнта разом з результатами обробки запиту. Алгоритм генерації SID (а в PHP як ідентифікатор сесії використовується т.з. GUID (Global Unique IDentifier)) дозволяє гарантувати його унікальність, тому унеможливлено того, що дві сесії матимуть один і той же ідентифікатор сесії.
PHP може використовувати два різні механізми як "транспортний засіб" для передачі SID:
- Cookies
- Параметр query string
Cookies - це, звичайно, зручніший спосіб передачі ідентифікатора. При цьому SID зберігається "усередині" браузеру і залишається непомітним для користувача. Але підтримка cookies - це необов'язкова умова для браузеру, вона може бути відсутньою або бути відключена у когось з відвідувачів, тому в загальному випадку вважатися на них не можна. В цьому випадку можна використовувати менш "красивий", але надійніший спосіб - передачу SID через параметр query string. PHP має можливість автоматично додавати SID до всіх линкам в сторінках, що генеруються, HTML, тому вам, як правило, не потрібно буде піклуватися про те, аби додавати цей ідентифікатор до кожного линку уручну. Якщо ж ви по яких-небудь причинах хочете самі передавати ідентифікатор сесії - ви завжди можете отримати його з константи SID або з функції session_id().
Створення і використання сесійних змінних
Для того, щоб мати можливість використовувати сесійні змінні в своїй програмі, необхідно спочатку створити сесію. Для цього необхідно додати наступну строчку у ваш код:
session_start();
Хай вас не бентежить питання: "Що буде, якщо я викличу цю функцію двічі?", все буде в порядку. Вам необхідно викликати цю функцію на кожній сторінці, на якій вам необхідно використовувати сесійні змінні. Крім того, якщо ви часто використовуєте сесійні змінні в своїх програмах, ви можете просто змінити налаштування PHP так, щоб сесії ініціалізувалися автоматично.
Для наочності сесії можна задати ім'я за допомогою функції session_name([имя_сессии]). Робити це потрібно ще до ініціалізації сесії. Отримати ім'я поточної сесії можна за допомогою цієї ж функції, викликаної без параметрів: session_name();
Реєстрація сесійних змінних проводиться шляхом додавання наступної строчки у ваш код:
session_register('var1','var2'...);
Зареєструвати змінну також можна, просто записавши її значення в асоціативний масив $_SESSION, тобто написавши
$_SESSION['имя_переменной']= 'значение_переменой';
У цьому масиві зберігаються всі зареєстровані (тобто глобальні) змінні сесії.
Доступ до таких змінних здійснюється за допомогою масиву $_SESSION['имя_переменной'] (або $HTTP_SESSION_VARS['имя_переменной'] для версії PHP 4.0.6 і раніших). Якщо ж в налаштуваннях php включена опція register_globals, то до сесійних змінних можна звертатися ще і як до звичайних змінних, наприклад так: $имя_переменной.
Як параметри функції передаються імена сесійних змінних, які необхідно створити. Звернете увагу на те, що передаються саме імена, а не самі змінні, як можна подумати. Необхідно пам'ятати про це, щоб уникнути помилок.
Після того, як сесійна змінна зареєстрована - вона може бути використана на будь-якій сторінці сайту в межах однієї і тієї ж призначеної для користувача сесії. Повторена реєстрація змінної необов'язкова (тобто зареєструвавши змінну на одній сторінці абсолютно необов'язково реєструвати її ж на всіх сторінках, де необхідне її використання). Але якщо ви реєструватимете змінні на кожній сторінці - теж нічого страшного не станеться.
Отримати ідентифікатор поточної сесії можна за допомогою функції session_id().
Спосіб звернення до сесійних змінних залежить від налаштувань у файлі php.ini. Якщо register_globals включений, то звернення до сесійної змінної по синтаксису нічим не відрізнятиметься від звернення до звичайної змінної:
session_register('myVar');
$myVar = 5;
Якщо ж він вимкнений - те звертатися до сесійних змінних необхідно через глобальний масив $HTTP_SESSION_VARS:
session_register('myVar');
$HTTP_SESSION_VARS['myVar']= 5;
Приклад 1.
page1.php
<?php
session_start();
session_register('myVar');
$myVar = 'It works! This is value of session variable'; ?>
<html>
<а href="page2.php">click here</a>
</html>
page2.php
<?php session_start(); echo $myVar; ?>
Приклад 2.
<? session_start();
// створюємо нову сесію або
// відновлюємо поточну
echo session_id();
// виводимо ідентифікатор сесії
?>
<html>
<head>
<title>My home page</title>
</head>
...
// домашня сторіночка
</html>
<? echo session_name();
// виводимо ім'я поточної сесії.
// В даному випадку це PHPSESSID
?>
Дата добавления: 2016-04-02; просмотров: 758;