Что использовать: Session против Cookie

PHP: Когда надо использовать куки, а когда сессии. Важнейшей особенностью веб-программирования является возможность беспрепятственно передавать данные от одной страницы к другой. Чаще всего этой возможностью пользуются для передачи логинов пользователей, сообщений об ошибке, содержимого «тележек» в интернет-магазинах и т.д.

Что «сохранить» данные на странице, необходимо использовать следующие глобальные переменных: $_COOKIE или $_SESSION. Однако, не смотря на то, что в итоге вы достигните одну и ту же цель, эти переменные необходимо использовать только в определённых случаях. Целью данной статьи я ставлю задачу — дать краткий обзор различий Session (далее «сессии») и Cookie (далее «печеньки». Не надо говорить что я переводил промтом, мне просто действительно нравиться называть их «печеньками»), рассказать, когда надо использовать одно, а когда другое, а также рассказать об их «плюсах» и «минусах».

Их разница заключается лишь в способе хранения данных: Печеньки хранят данные в браузере пользователя, а Сессии на стороне сервера.

Основы сессий (кратко)

В двух словах, сессии — это механизм, который позволяет однозначно идентифицировать клиент (браузер) пользователя и созданный для этого клиента файл на стороне сервера, в котором будут храниться необходимые данные.

Плюсы сессий

  1. Легко можно хранить большие объёмы данных
  2. При каждой загрузке страницы, на сервер передаётся только ссылка на сессию, что позволяет экономить трафик, в отличии от «печенек», которые передают всю информацию.
  3. Данные храняться на веб-сервере, что делает сессии безопасными потому, что они не могут быть изменены или просмотрены на стороне клиента.

Минусы сессий

  1. Сессии прекращают свою жизнь при закрытии браузера или по истечению некоторого количества времени. Однако, срок жизни сессии можно изменить используя файл настроек — php.ini. Там же, вы можете сделать сессии вечными.

Основы «печенек»

«Печеньки» отправляются на сервер каждый раз, когда вы загружаете страницу. После создания «печеньки» ей задаётся срок жизни. По истечению этого срока — «печенька» прекращает своё существование.

Плюсы

  1. «Печенька» может существовать настолько долго, на сколько это необходимо сайту. Она будет существовать даже в том случае, если вы закроете и вновь отроете браузер.
  2. Позволяют использовать формы аля «входить автоматически».
  3. Можно хранить временную информацию,  различные пользовательские настройки, например, если пользователь просматривает список отсортированный особенном образом, то можно запомнить тип сортировки и использовать его автоматически для всех списков, просматриваемых этим пользователем.

Минусы

  1. Храняться на пользовательском компьютере, а следовательно, пользователь может просмотреть или изменить их.
  2. Можно хранить информацию, не превышающую определённого размера.
  3. Большее количество информации должно уйти на сервер, что требует больше трафика.

Использование печенек на практике

Создание печеньки.

Определение функции: bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Создание печеньки

<?php
    if (!isset($_COOKIE['Ordering'])) {
        setcookie("Ordering", $_POST['ChangeOrdering'], time() + 31536000);
    }
?>

Использование печенек

<?php
	echo (isset($_COOKIE[‘ordering’])) ? $_COOKIE[‘ordering’] : ‘cookie value not set’;
?>

Удаление печенек

<?php setcookie(‘favorite_color’); ?>  

Создание пустой печеньки равносильно её удалению, но, конечно, это действие не приведёт к удалению файла с компьютера пользователя. Однако, вы можете установить срок жизни печеньки, по истечению которого файл с информацией будет стёрт с пользовательского компьютера.

Использование сессий на практике

Создание сессии

<?php session_start(); ?>

Этот код должен находиться в верхней части кода, перед ним не должно быть сделано ни какого вывода (echo, print и т.д.). Эта функция проверяет, отправил ли пользовательский браузер печеньки или нет. Если они отправлены, то он загрузит данные из сессии, а если нет, то создаст новый файл сессии на сервере.

Присваиваем значение

<?php $_SESSION[‘first_name’] = ‘Brian’; ?>  

Считываем значение сессии

<?php echo $_SESSION[‘first_name’]; ?>

Удаляем (очищаем значение) сессию

<?php unset($_SESSION[‘first_name’]); ?>

Уничтожаем сессию сессию

<?php session_destroy(); ?> 

Краткий вывод

Сессии храняться на стороне сервера, а печеньки на стороне пользователя. Все они имеют свои преимущества и недостатки, но однажды, настанет день, когда вы сами поймёте, в какой ситуации лучше использовать сессии, а в какой печеньки.

Дополнение от Artem:

Да и в cookie хранить нужно только приватные настройки каждого клиента либо инфу, которая может быть утеряна после закрытия браузера, либо инфу, которая может понадобиться при переходе на другой сервер.

Вообще же лучше всего использовать клиентские способы хранения состояния + хранить состояния в базе данных и в крайнем случае (как пароли) хранить что-либо на сервере, то бишь в сессии. Иначе сервер просто не выдержит нагрузку.

Что использовать: Session против Cookie: 5 комментариев

  1. ещё одно различие не указано:
    сессия выделяется пользователю и при доступе на сайт 1000+ пользователей в сессии хранить не столь важные данные (типа корзины с покупками) просто нельзя. Памяти сервака не хватит.

    В то же время, куки, как было сказано, требуют трафика. Но трафик более доступный, нежели ограничения сервера под нагрузкой.

    И пофиг на клиентов с медленным инетом, это их проблемы. И если под них подстраиваться, то они ни когда не будут париться о том, что им пора менять провайдера.

    1. Да и в cookie хранить нужно только приватные настройки каждого клиента либо инфу, которая может быть утеряна после закрытия браузера, либо инфу, которая может понадобиться при переходе на другой сервер.

      Вообще же лучше всего использовать клиентские способы хранения состояния + хранить состояния в базе данных и в крайнем случае (как пароли) хранить что-либо на сервере, то бишь в сессии. Иначе сервер просто не выдержит нагрузку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *