067 607 57 84
МЕНЮ

Робота з PHP сесіями і куками користувача. Короткий посібник для початківців.

Основні моменти при роботі з сесіями. Опис механізму роботи. Як сесії потрапляють в кукі або в заголовки HTTP відповідей?

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

Кукі - дані, які зберігаються у клієнта (в браузері, в додатку ...). Можуть бути закриті клієнтом або не підтримуватись. Можуть підмінятися клієнтом або третьою стороною. Доступ до куків, через глобальну PHP змінну $ _COOKIES.

Для підключення до сховища сесій в PHP є функція session_start(). При виклику цієї функції, автоматично підхоплюється з HTTP запиту - унікальний ідентифікатор сесії, або якщо такого немає, створюється новий. Тому важливо викликати session_start() для встановлення заголовків headers. В кінці виконання PHP скрипта, виконується серіалізація $_SESSIONS і запис в сховище сесій, за унікальним ідентифікатором, або використовуючи функцію session_write_close().

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

Видалення сесії
// Видаляємо куки сесії, 
setcookie(session_name(), session_id(), time()-60*60*24);
// Видаляємо сесію 
session_unset();
session_destroy();

                    
Автоматичне видалення сесії. Очищення сміття.

PHP сам чистить старі, невикористовувані сесії, для цього є механізм garbage collection. У php.ini є параметри, що відповідають за налаштування цього механізму session.gc_probability і session.gc_divisor.

Зависання сесії. Dead lock в сесіях.

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

Особливості використання session_set_cookie_params()

До використання функції session_set_cookie_params() необхідно встановити session_name(), інакше передача ідентифікатора сесії у відповідь запиту не станься. Це просто особливість роботи з сесіями.