Сесії в PHP

Матеріал з Вікі ЦДУ
Версія від 23:15, 19 травня 2013; Леженко Дмитрий (обговореннявнесок)

(різн.) ← Попередня версія • Поточна версія (різн.) • Новіша версія → (різн.)
Перейти до: навігація, пошук

Сесії (сеанси) в PHP

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

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

Протокол HTTP є протоколом "без збереження стану". Це означає, що даний протокол не має вбудованого способу збереження стану між двома транзакціями. Коли користувач відкриває спочатку одну сторінку сайту, а потім переходить на іншу сторінку цього ж сайту, то грунтуючись тільки на засоби, що надаються протоколом HTTP неможливо встановити, що обидва запиту відносяться до одного користувача. Необхідний метод, за допомогою якого було б відстежувати інформацію про користувача протягом одного сеансу зв'язку з Web-сайтів. Одним з таких методів є управління сеансами за допомогою призначених для цього функцій. Для нас важливо те, що сеанс по суті, являє собою групу змінних, які, на відміну від звичайних змінних, зберігаються і після завершення виконання PHP-сценарію.

При роботі з сесіями розрізняють наступні етапи:

-відкриття сесії
-реєстрація змінних сесії і їх використання
-закриття сесії


Як влаштовані, і як працюють сесії?

Для початку треба якось ідентифікувати браузер. Для цього треба видати йому унікальний ідентифікатор і попросити передавати його з кожним запитом.
Сесії використовують стандартні, добре відомі способи передачі даних. Власне, інших-то просто і немає. Ідентифікатор - це звичайна змінна. Типово її ім'я - PHPSESSID.
Завдання PHP відправити її браузеру, щоб той повернув її з наступним запитом. З уже згадуваного розділу FAQ ясно, що змінну можна передати тільки двома способами: у cookies або POST / GET запитом. PHP використовує обидва варіанти.

За це відповідають два налаштування в php.ini:
session.use_cookies - якщо дорівнює 1, то PHP передає ідентифікатор в cookies, якщо 0 - то ні.
session.use_trans_sid якщо дорівнює 1, то PHP передає його, додаючи до URL і формам, якщо 0 - то ні.

Міняти ці та інші параметри сесій можна так само, як і інші настройки PHP - у файлі php.ini, а так само за допомогою команди ini_set () або у файлах налаштування веб-сервера.

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

Якщо активована тільки друга, то cookies не виставляються. А відбувається те, заради чого, в основному, власне, і варто використовувати вбудований механізм сесій. Після того, як скрипт виконує свою роботу, і сторінка повністю сформована, PHP переглядає її всю і дописує до кожної посиланням і до кожної форми передачу ідентифікатора сесії. Це виглядає приблизно так:
<a href="/index.php">Index</a>

перетворюється на <a href="/index.php?PHPSESSID=9ebca8bd62c830d3e79272b4f585ff8f"> Index </ a>

а до форм додається приховане поле
<input type="hidden" name="PHPSESSID" value="00196c1c1a02e4c37ac04f921f4a5eec" />

І браузер при кліці на якесь посилання, або при натисканні на кнопку у формі, пошле в запиті потрібну нам змінну - ідентифікатор сесії!

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

За умовчанням в останніх версіях PHP включені обидві опції. Як PHP надходить в цьому випадку? Кука виставляється завжди. А посилання автодополняются тільки якщо РНР не виявлено cookies з ідентифікатором сесії. Коли користувач в првие раз за цей сеанс заходить на сайт, йому ставиться cookies, і доповнюються посилання. При наступному запиті, якщо cookies підтримуються, PHP бачить cookies і перестає доповнювати посилання.
Якщо cookies не працюють, то PHP продовжує справно додавати ід до посилань, і сесія не втрачається.
Користувачі, у яких працюють cookies, побачать довге посилання з ID тільки один раз.

З передачею ідентифікатора закінчили. Тепер залишилося прив'язати до нього файл з даними на стороні сервера. PHP це зробить за нас. Досить просто написати:

session_start ();
$ _SESSION ['Test'] = 'Hello world!';
І PHP запише у файл, пов'язаний з цією сесією, змінну test.

Тут дуже важливе зауваження.

Масив $ _SESSION - особливий.
У ньому, власне, і знаходяться змінні, які ми ходимо зробити доступними в різних скриптах.
Щоб помістити змінну в сесію, досить привласнити її елементу масиву $ _SESSION.
Щоб отримати її значення - досить звернутися до того ж елементу. Приклад буде трохи нижче.

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

<?
session_start ();
if (! isset ($ _SESSION ['counter'])) $ _SESSION ['counter'] = 0;
echo "Ви оновили цю сторінку". $ _SESSION ['counter'] + +. "раз.";
echo "<br> <a href=".$_SERVER['PHP_SELF']."> оновити";
?> Ми перевіряємо, чи є у нас в сесії мінлива counter, якщо ні, то створюємо її зі значенням 0, а далі виводимо її значення і збільшуємо на одиницю. Збільшене значення запишеться у сесію, і при наступному виклику скрипта змінна буде мати значення 1, і так далі. Все дуже просто.

Для того, щоб мати доступ до змінних сесії на будь-яких сторінках сайту, треба написати ТІЛЬКИ ОДНУ (!) Рядок у самому початку КОЖНОГО файлу, в якому нам потрібні сесії:

session_start ();
І далі звертатися до елементів масиву $ _SESSION. Наприклад, перевірка авторизації буде виглядати приблизно так:

session_start ();
if ($ _SESSION ['authorized'] <> 1) {
header ("Location: / auth.php");
exit;
}
Видалення змінних з сесії. Якщо у вас register_globals = off, то достатньо написати

unset ($ _SESSION ['var']);
Якщо ж ні, то тоді поруч з нею треба написати:

session_unregister ('var');

Відкриття сесії

Найпростіший спосіб відкриття сесії полягає у використанні функції session_start, яка викликається на початку PHP-сценарію:

session_start

синтаксис:

   session_start ();

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


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

Після ініціалізації сесії з'являється можливість зберігати інформацію в су-перглобальном масиві $ _SESSION. Нехай є файл index.php у якому в масив $ _SESSION зберігається змінна і масив.


<? php

   / / Ініціюємо сесію

   session_start ();


   / / Розміщуємо значення в сесію

   $ _SESSION ['Name'] = "value";


   / / Розміщуємо масив у сесію

   $ arr = array ("first", "second", "third");

   $ _SESSION ['Arr'] = $ arr;


   / / Виводимо посилання на іншу сторінку

   echo "<a href='other.php'> інша сторінка </ a>";

?>

На сторінках, де відбувається виклик функції session_start (), значення даних змінних можна витягти з суперглобального масиву $ _SESSION. У наступному лістингу наводиться вміст сторінки other.php, де витягуються дані, раніше поміщені на сторінці index.php.


<? php

  / / Ініціюємо сесію

   session_start ();

  / / Виводимо вміст суперглобального масиву $ _SESSION

echo "<рre>";

print_r ($ _SESSION);

echo "</ pre>";

?>

Результат роботи скрипта виглядає наступним чином:


Array

(

     [name] => value

     [arr] => Array

         (

             [0] => first

             [1] => second

             [2] => third

         )


)


Закриття сесії

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

синтаксис:

   unset ($ _SESSION ["username"]);


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

Розглянемо приклад простої сесії, що працює з трьома сторінками. При відвідуванні користувачем першої сторінки відкривається сесія і реєструється змінна $ username. Відповідний код реалізації приведений в лістингу:


<?

   session_start ();

   $ _SESSION ['Username'] = "maksim";

   echo 'Привіт,'. $ _SESSION ['username'].<br>;

?>

   <a href="page2.php"> На наступну сторінку </ a>

Після цього, користувач maksim натискає на посилання і потрапляє на сторінку page2.php, код якої наведено в лістингу:


<?

   session_start ();

   echo $ _SESSION ['username']. ', Ти прийшов на іншу сторінку цього сайту! ';

   echo ("<br>");

?>

   <a href="page3.php"> На наступну сторінку </ a>

При натисканні на посилання, користувач потрапляє на сторінку page3.php, при цьому відбувається розреєстрації сеансовом змінної і знищення сесії. Відповідний код реалізації приведений в лістингу:


<?

   session_start ();

   unset ($ _SESSION ['username']); / / разрегістріровалі змінну

   echo 'Привіт,'. $ _SESSION ['username'];

   / * Тепер ім'я користувача вже не виводиться * /

   session_destroy (); / / знищуємо сесію

?>