После авторизации Вы получите доступ к файлам, скрытым материалам сайта, исходным кодам
возможность комментировать и т.д.

Вы можете авторизоваться на сайте всего одним кликом:

2016-07-06
Основы PHP → Cookies и сессии
PHP, Кукисы, Печеньки, Создать сессию

В этом уроке я расскажу, что такое cookies, о их роли и применении...

Что такое cookies и с чем их едят

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

Cookies различных сайтов изолированы друг от друга. Представляют они собой пары "имя = значение". Для простоты можно представить их как текстовый файл такого вида:

yandex.ru:
     login = dima
     password = a123
     some_name = some_value

example1.ru:
     comment_name = dr.zlo
     comment_email = dmitriy@yandex.ru

example2.ru:
     comment_name = dr.zlo
     comment_email = dmitriy@yandex.ru

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

Управляет cookies удаленный сервер, т. е. он может их читать, добавлять и изменять. А для хранения информации используется компьютер пользователя.

Как это работает?

Давайте вспомним, как происходит обмен информацией в Интернете. Запрашивая страницу, браузер отправляет веб-серверу короткий текст с HTTP-запросом. Например, для доступа к странице http://www.example.org/index.html браузер отправляет на сервер www.example.org следующий запрос:

GET /index.html HTTP/1.1
Host: www.example.org

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

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value

(содержимое страницы)

Строка Set-Cookie отправляется лишь тогда, когда сервер желает, чтобы браузер сохранил cookies. В этом случае, если cookies поддерживаются браузером и их прием включен, веб-обозреватель запоминает строку name=value (имя = значение) и отправляет ее обратно серверу с каждым последующим запросом. Например, при запросе страницы http://www.example.org/spec.html браузер пошлет серверу www.example.org следующий запрос:

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value
Accept: */*

Этот запрос отличается от первого запроса тем, что содержит строку, которую сервер отправил браузеру ранее. Таким образом, сервер узнает, что этот запрос связан с предыдущим. Сервер отвечает, отправляя запрашиваемую страницу и, возможно, добавив новые cookies. Количество cookies для одного сайта никак не ограничивается.

Кроме пары "имя = значение", cookie может содержать срок действия, путь и доменное имя. Домен и путь говорят браузеру, что cookie должно быть отправлено обратно на сервер при запросах URL для указанного домена и пути. Если они не указаны, используются домен и путь запрошенной страницы.

Фактически cookies определяются тройкой параметров "имя—домен—путь". Иными словами, cookies с разными путями или доменами являются разными, даже если имеют одинаковые имена.

Дата истечения указывает браузеру, когда удалить cookies. Если срок истечения не указан, cookies удаляется по окончании пользовательского сеанса, т. е. с закрытием браузера.

Дата истечения указывается в формате "Нед, ДД-Мес-ГГГГ ЧЧ:ММ:СС GMT". Например:

Set-Cookie: RMID=732423sdfs73242; expires=Fri, 31-Dec-2020 23:59:59 GMT;
path=/; domain=.example.net

Cookie из примера имеет имя RMID и значение 732423sdfs73242. Срок его хранения истечет 31 декабря 2020 года в 23:59:59. Путь "/" и домен example.net показывают браузеру, что нужно отправить cookies при просмотре любой страницы в домене example.net.

Манипулируем cookies средствами PHP

PHP имеет удобный набор функций для работы с cookies. Чтобы установить cookies на период сессии (до закрытия браузера), воспользуйтесь функцией setcookie(). Например, вот так:

setcookie("name", "value");

Если вы хотите запомнить cookies на некоторое время, предположим, на неделю, воспользуйтесь той же функцией, но с тремя параметрами:

setcookie("name", "value", time() + 3600 * 24 * 7);

Здесь последний параметр — время истечения cookies. Он указывается в формате timestamp. Timespamp — это число секунд, прошедших с 00:00:00 1 января 1970 года.

Функция time() возвращает текущее время, к нему мы прибавляем неделю (3600 24 7 секунд). Начинающему программисту может показаться странным такой формат времени, однако, поверьте, очень часто намного удобнее работать с целочисленным значением, чем со строковым представлением даты.

Функцию setcookie() можно вызывать и с большим числом параметров, если есть необходимость установить прочие атрибуты cookies. Однако в большинстве случаев достаточно двух приведенных ранее примеров.

Чтобы прочитать cookies, следует воспользоваться системной переменной $_COOKIES:

echo $_COOKIE['name'];

Проверить, установлены ли cookies, можно так:

if (isset($_COOKIE['name']))
   echo $_COOKIE['name'];

Кстати, используя словарь $_COOKIES , можно и сохранять значения cookies, но только на период сессии (без указания времени истечения).

//Операция
   $_COOKIE['name'] = 'value';
//Аналогична
   setcookie("name", "value");

Что такое сессии PHP и как они работают?

Протокол HTTP является протоколом "без сохранения состояния" и не имеет встроенной возможности поддерживать сеанс работы с сайтом. Иными словами, если не прибегать к различным ухищрениям, сайт не "помнит" ваших предыдущих взаимодействий.

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

Для решения таких задач в PHP реализован механизм поддержки сессий. Если есть необходимость запоминать состояние сеанса, все, что нужно сделать, — это вызвать в начале сценария функцию session_start().

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

Но где искать этот самый идентификатор сессии? PHP предлагает два механизма:

  1. Хранить идентификатор сессии в cookies;
  2. Добавлять идентификатор сессии к внутренним ссылкам в качестве параметра URL.

Последний вариант имеет смысл только тогда, когда в браузере отключены cookies. Он плох тем, что внутренние ссылки станут выглядеть не очень красиво. Например, ссылка index.php?page=main превратится в
index.php?page=main&PHPSESSID=1dc9fcb731a123ec16fb2e49ece325ed
Я рекомендую пользоваться только первым вариантом. Сейчас все современные браузеры поддерживают работу с cookies, и можно смело полагаться на то, что сессии на вашем сайте будут работать с их помощью. Если пользователь отключил cookies в браузере, можно считать, что ему не нужна поддержка сеансов работы с веб-сайтами.

Информация, актуальная в рамках сессии, хранится в системной переменной (словаре) $_SESSION. Вот так можно сохранить данные:

$_SESSION['username'] = 'Vasya';

А вот так прочитать:

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

Когда сессия больше не нужна, например пользователь нажал кнопку Выход, следует уничтожить ее. Для этого существует функция session_destroy(). Однако перед ее вызовом нужно удалить все сохраненные в сессии данные. Например, вот так:

unset($_SESSION['username']);
session_destroy();
776
0
Пожалуйста, авторизируйтесь, чтобы скачать архив с файлами урока