Основні моменти при роботі з сесіями. Опис механізму роботи. Як сесії потрапляють в кукі або в заголовки 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(), інакше передача ідентифікатора сесії у відповідь запиту не станься. Це просто особливість роботи з сесіями.