Управління сеансами в РНР.

Що таке управління сеансом.HTTP інколи називають "протоколом без стану". Це означає, що даний протокол не має вбудованого способу підтримки стану між двома транзакціями. Коли користувач запрошує один за одним дві сторінки, HTTP не забезпечує можливості повідомити, що обоє запиту виходитимуть від одного і того ж користувача. Таким чином, ідея управління сеансами полягає в забезпеченні відстежування користувача протягом одного сеансу зв'язку з Web-сайтом. Якщо це удасться здійснити, ми зможемо легко підтримувати підключення користувача і надання йому вмісту сайту відповідно до його рівня прав доступу або персональних налаштувань. Ми зуміємо відстежувати поведінку користувача.

У раніших версіях РНР управління сеансами здійснювалося засобами PHPLib, базової бібліотеки РНР, яка і зараз є корисним набором інструментів. Про це можна прочитати на

http://phplib.netuse.de/index.php3

Четверта версія РНР включає власні вбудовані функції управління сеансом. Концептуально вони подібні PHPLib, але PHPLib окрім цього забезпечує em і ряд додаткових функціональних можливостей. Отже якщо виявиться, що ці власні функції не цілком відповідають вашим вимогам, ніщо не заважає розглянути можливість використання PHPLib.

Основні функціональні засоби управління сеансом.Для запуску сеансу в РНР використовується унікальний ідентифікатор сеансу, що є зашифрованим випадковим числом. Ідентифікатор сеансу генерується РНР і зберігається на стороні клієнта протягом всього часу життя сеансу. Для зберігання ідентифікатора сеансу використовується або cookie-набір на комп'ютері користувача, або URL.

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

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

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

Що таке cookie-набір?cookie-набір — це невеликий фрагмент інформації, який сценарії зберігають на клієнтській машині. Аби встановити cookie-набір на машині користувача, необхідно відправити йому HTTP-заголовок, що містить дані в наступному форматі.

Set-Cookie: NAME=VALUE; [expires=DATE;] [path=PATH;] [domain=DOMAIN_NAME;] [secure]

Це створить cookie-набір з ім'ям NAME і значенням VALUE. Всі останні параметри є необов'язковими. У expires задається дата закінчення терміну дії, після настання якої cookie-набір перестане розглядатися як актуальний. Відмітимо, що якщо дата закінчення терміну дії не задана, cookie-набір буде постійним, поки його хто-небудь не видалить уручну — або ви, або сам користувач). Два параметри path і domain застосовуються для визначення одного або декількох URL, до яких відноситься даний cookie-набір. Ключове слово secure означає, що cookie-набір не може вирушати через просте HTTP-з’єднання.

Коли браузер з'єднується з URL, він спочатку шукає cookie-набори, що зберігаються локально. Якщо які-небудь з них відносяться до URL, з яким встановлено з'єднання, вони передаються назад на сервер.

Установка cookie-набіров з РНР.cookie-набори в РНР можна встановити уручну, використовуючи функцію setcookie(). Вона має наступний прототип:

int setcookie (string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Параметри в точності відповідають тим, які використовуються в описаному вище заголовку Set-Cookie. Якщо cookie-набір встановлений як

setcookie ("mycookie", "value");

то коли користувач звертається до наступної сторінки на вашому сайті (або перезаг­ружає поточну сторінку), ви дістаєте доступ до змінної з ім'ям $mycookie, яка містить значення "value". Доступ до цієї змінної можна отримати також через $HTTP_COOKIE_VARS["mycookie"].

Для видалення cookie-набору необхідно викликати setcookie() з тим же ім'ям, але без вказівки значення. Якщо cookie-набір встановлювався з іншими параметрами (такими як специфічні URL або дати виділення), потрібно буде відправити ті ж параметри повторно, інакше cookie-набір видалений не буде.

Для установки cookie-набору вручну можна скористатися також функцією Header() і описаним вище синтаксисом представлення cookie-набору. Проте при цьому слід мати на увазі, що заголовки cookie-набіров повинні вирушати перед всіма іншими заголовками (інакше заголовки cookie-набіров працювати не будуть).

Використання cookie-набіров в сеансах.При використанні cookie-набіров виникають деякі проблеми: є браузери, які не приймають cookie-набори, а є користувачі, які забороняють використання cookie-набіров в своїх браузерах. Це одна з причин, по яких в сеансах РНР використовуються подвійний метод cookie-набір/адрес URL (нижче це питання розглядається детальніше).

У сеансі РНР немає необхідності задавати cookie-набори вручну. Це за вас зроблять функції сеансу. Для того, щоб проглянути вміст cookie-набору, встановлений при управлінні сеансом, можна скористатися функцією session_get_cookie_params(). Вона повертає асоціативний масив, що містить елементи lifetime, path і domain.

Можна використовувати також:

session_set_cookie_params($lifetime, $path, $domain);

Цей оператор встановлює параметри cookie-набору для сеансу.

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

http://home.netscape.com/newsref/std/cookie_spec.html

Збереження ідентифікатора сеансу.У РНР cookie-набори в сеансах використовуються за замовчуванням. Якщо є можливість встановити cookie-набори, то для збереження ідентифікатора сеансу використовуватиметься саме цей спосіб. Інший метод, який може застосовуватися в РНР, полягає в додаванні иден­тификатора сеансу до адреси URL. Можна зробити так, щоб ідентифікатор сеансу до­бавлялся до URL автоматично — для цього слід скомпілювати РНР з опцією --enable-trans-sid.

Можна вбудувати ідентифікатор сеансу в посилання, аби забезпечити його передачу. Ідентифікатор сеансу запам'ятовуватиметься в константі SID. Для того, щоб передати його уручну, його потрібно буде додати в кінець посилання, аналогічно параметру GET:

<А HREF="link.php?<?=SID?>">

У загальному випадку простіше компілювати РНР --enable-trans-sid, якщо лише це можливо (відмітимо попутно, що константа SID може використовуватися для вищеописаних цілей лише в тому випадку, якщо конфігурація РНР виконувалася з --епаblе-track-vars).

Реалізація управління простим сеансом. Основними етапами використання сеансу є наступні:

· Запуск сеансу

· Реєстрація змінних сеансу

· Використання змінних сеансу

· Відміна реєстрації змінних і закриття сеансу

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

Запуск сеансу.Перш ніж можна буде скористатися функціональними можливостями сеансу, слід запустити сам сеанс. Існує три способи зробити це.

Перший (і найпростіший) полягає в тому, що сценарій починається з виклику функції

session_start() ;

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

Треба відзначити, що це прекрасний спосіб — виклик session_start() на початку сценаріїв, в яких використовуються сеанси.

Другий спосіб полягає в тому, що сеанс запускається при спробі зареєструвати змінні сеансу (див. далі).

Третій спосіб запустити сеанс — задати установки РНР, при яких сеанс запускатиметься автоматично, як тільки хто-небудь відвідає ваш сайт. Для цього слід скористатися опцією session.auto_start у файлі php.ini (більш детально вказаний спосіб буде описаний при розгляді конфігурації).

Реєстрація змінних сеансу.Для того, щоб дістати можливість відстежувати змінні від одного сценарію іншому, їх необхідно зареєструвати. Це робиться шляхом виклику функції session_register(). Наприклад, для реєстрації змінної $myvar застосовується наступний код.

$myvar = 5; session_register("myvar");

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

За один прийом можна зареєструвати більш за одну змінну, передавши розділений комами список імен змінних:

session_register("myvar1", "myvar2");

Використання змінних сеансу.Аби зробити змінну сеансу доступною для використання, спочатку необхідно запустити сеанс, скориставшись одним з описаних вище способів. Після цього з'являється доступ до цієї змінної. Якщо опція register_globals включена, то доступ до цієї змінної можна отримати через скорочену форму її імені, наприклад $myvar. Якщо ж згадана опція не включена, дістати доступ до змінної можна через асоціативний масив $HTTP_SESSION_VARS, наприклад $HTTP_SESSION_VARS ["myvar"].

Змінні сеансу не можуть бути перезаписані даними GET або POST. Це добре з точки зору забезпечення безпеки, проте зв'язано з деякими обмеженнями при кодуванні.

З іншого боку, від вас буде потрібно ретельність при перевірці на предмет того, чи встановлені вже змінні сеансу (наприклад, з використанням isset() або empty()). Крім того, слід мати на увазі, що змінні можуть бути встановлені користувачем через GET або POST. Перевірити, чи є змінна зареєстрованої змінної сеансу, можна звернувшись до функції session_is_registered(). Виклик функції виконується таким чином:

$result = session_is_registered("myvar");

Ця функція перевірить, чи є $myvar зареєстрованою змінною сеансу, і поверне true або false. Можна поступити і по-іншому — перевірити масив $HTTP_SESSION_VARS на предмет наявності в нім змінній.

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

session_unregister("myvar");

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

Після закінчення сеансу спочатку потрібно буде відмінити реєстрацію всіх змінних, а потім для обнулення ідентифікатора сеансу викликати

session_destroy();

Приклад простого сеансу.Викладений вище матеріал може здатися декілька абстрактним, тому зараз вашій увазі пропонується приклад.Приведений в нім код забезпечує обробку трьох сторінок. На першій сторінці ми запустимо сеанс і зареєструємо змінну $sess_var Код показаний в лістингу 6.15.








Дата добавления: 2016-04-02; просмотров: 764;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.014 сек.