Cookie в PHP – как это работает?

Cookie в PHP

Куки очень важная вещь в PHP. Дословно переводятся как печеньки. Хотя ничего общего с печеньками у этой технологии нет. Почему разработчики выбрали именно это название, неизвестно. Итак, как же работают куки в PHP?

Когда сервер принимает от нас данные, будь то метод POST или GET, то он о нас ничего не знает, то есть он принял данные, обработал их и выдал нам результат. И когда мы заново или еще раз посылаем ему запрос, то он о нас ничего не помнит – он не знает, мы новый пользователь или нет? Это похоже на то, как сидит слепой человек где-нибудь в переходе и ему прохожий кинул денежку, а потом кинул еще, однако он не знает – это тот же человек ему кинул или другой.

Так вот, возвращаясь к нашему серверу – здесь возникает необходимость как-то и где-то сохранять промежуточные данные. Не такие критичные или секретные, а например имя пользователя или пароль. Однако, будьте внимательны, если вы передаете пароль, то его следует передавать в зашифрованном виде, а зашифровать его можно с помощью технологии MD5, которую мы будем разбирать в статье «Хеширование». Итак, сервер может спросить – как тебя зовут? Пользователь отвечает – меня зовут Вася! И если в следующий раз этот пользователь снова к нам зайдет, мы ему скажем – привет Вася, ты к нам пришел второй раз!

Теперь давайте немного подробнее расскажу суть работы этой технологии – у нас есть пользователь, который заходит к нам в первый раз и есть сервер, который ничего не знает и не помнит. На сервере лежат какие-то HTML странички. Пользователь запросил у нас страничку, мы ему эту страничку отдаем и спрашиваем – тебя как зовут? Пользователь отвечает, что его зовут Вася. Теперь мы делаем следующее – мы говорим серверу, чтобы сервер сказал браузеру, чтобы тот поставил Васе куку. Где он ее у него поставит нам все равно. Нам это не интересно. Нам интересно другое.

Нам интересно, что же представляет из себя кука? Кука в PHP – это просто строка вида – имя куки и значение куки (UserName = Вася). UserName – это имя куки, а Вася – это значение. Тут иногда задают такой вопрос – как браузеры хранят куки? Вообще-то нам, как серверным разработчикам абсолютно все равно как браузеры хранят куки. Тем более что все они хранят их по-разному. Кто-то их себе в файл записывает, кто-то их шифрует, кто-то не шифрует, кто-то сжимает, кто-то не сжимает. Поэтому нам по барабану, как они их хранят.

Теперь, в следующий раз, когда этот же пользователь приходит к нам, сервер посылает заголовки ответа (метод – GET или POST, user-agent и т.д.), а также он смотрит, нет ли кук, поставленных с этого домена. Если кука в PHP есть, он ее прицепляет к заголовкам ответа и посылает ее нам. А мы уже у себя проверяем — кука есть? Есть, и выводим ее – echo «Привет». UserName.

В спецификации сказано, что общий объем одной куки не должен превышать 4 кб. Вообще в спецификации много чего сказано, однако только это условие сохранилось и по сей день.

Далее давайте посмотрим, как нам работать с куками в PHP. Мы же все-таки должны как-то их отправить, принять, прочитать и удалить, то есть мы с ними должны работать. Поэтому в PHP для этого дела была написана специальная функция. Функция так и называется – setcookie(). А вот так выглядит строка заголовка ответа сервера при установке куки – Set-Cookie: userName=Vasya. Увидев этот заголовок, браузер соответственно «вешает» куку. Когда пользователь приходит к нам во второй раз, браузер посылает заголовки запроса и смотрит – есть ли куки с этого домена. А вот строка заголовка запроса браузера на куку выглядит так, если кука в PHP есть – Cookie: userName=Vasya.

Итак, давайте посмотрим на функцию setcookie(). Эта функция может принимать множество параметров:

  1. Имя куки. Только латинские буквы, цифры, символ подчеркивания и дефис.
  2. Значение параметра
    Куки бывают двух видов – временные (или они еще называются сессионные) и постоянные. Слово постоянные мне не нравится – почистил кэш и нет кук. Так какие же они постоянные? Поэтому будем называть их условно-постоянные, то есть на какое-то время. Что такое сессионные или временные и вообще, что такое сессия в случае с куками? Под сессией понимается то время, пока открыт браузер пользователя. То есть, если мы пошлем setcookie(имя, значение), то это мы посылаем временную куку. Здесь фишка в том, что многие браузеры никуда не сохраняют временные куки, а просто «хранят» их в памяти. Но это их трудности и особенности. Опять же, для нас это не интересно. То есть, что здесь у нас получается? Получается, что пока у пользователя открыт браузер, куки у него живут. Как только пользователь закроет браузер, куки удаляются. Если же мы хотим установить их на какое-то время, то нам нужен какой-то третий параметр.
    И третий параметр это:
  3. Дата истечения срока годности.
    Туда передается временная метка (timestamp). Теперь браузер запишет эту куку туда, куда он ее захочет записать, и она будет там «висеть», пока не истечет ее время. Как только ее время истечет, браузер ее удалит. Но опять же, это все условно. Какое бы время мы не задали, если пользователь постоянно трет куки в браузере, то она никогда не просуществует столько, сколько мы захотим.

Пример работы куки в PHP — когда вы заходите на свою почту (Yandex, Mail, Gmail), вы вводите логин и пароль, а ниже есть чекбокс – «запомнить меня», нажимаете его и в этот момент вам летит кука с вашим логином и паролем. И в следующий раз вы уже входите на свою почту, не вводя логин и пароль – это как раз и есть действие кук. Однако, многие почтовики перезапрашивают у вас логин и пароль, примерно через каждые две недели. Это сделано для того, чтобы проверить, вы ли туда заходите или нет. А вдруг не вы?

В принципе этих трех параметров вполне хватает и их все используют.

Примеры создания кук в PHP:

<?php
/* временная кука */
setcookie("TestCookie", $value);

/* кука на один час */
setcookie("TestCookie", $value, time()+3600);
?>

Здесь нас поджидает маленькая опасность. Важно запомнить: установка куки (setcookie(имя, значение)) должна быть до любого вывода данных в браузер:

<?php
/* Будет ошибка. Произведен вывод данных до
установки кук.
*/
echo "Hello!";
/* кука на один час */
setcookie("TestCookie", $value, time()+3600);
?>

Идем дальше. И следующий вопрос, который мы должны разобрать — это как нам читать куки в PHP?

По аналогии с глобальными массивами GET и POST, у нас есть также глобальный массив, который так и называется $_COOKIE. Соответственно имя куки будет ячейкой этого массива:

<?php
/* кука на один час */
setcookie("TestCookie", Vasya, time()+3600);
/* читаем куки */
echo $_COOKIE['TestCookie'];
?>

Обратите внимание, что когда мы первый раз зайдем на страничку, где мы выводим куки, то никакого вывода не будет. Почему? Потому что сначала первой строкой кода кука устанавливается, а когда мы нажмем F5 или заходим второй раз, то кука нам уже выводится.

Далее, у нас вторым параметром в куку передается строковое значение. Обратите внимание на слово «строковое». А что если мы хотим передать туда массив, ну чтобы, например, не посылать десять кук, а передать все значения массивом. Массив же – это не строковое значение! Для этого нам понадобится массив перевести в строку. Сделать это можно с помощью функции serialize().

<?php
$arr = array(
	"one"=>1,
	2=>"two",
	3=>true);
$str_arr = serialize($arr);
setcookie("TestCookie", $str_arr);
?>

Чтобы обратно распаковать строку, используется функция unserialize().

Иногда нам нужно принудительно удалить поставленную куку в PHP. Зачем это бывает нужно? Например, в той же самой почте, когда мы заходим в нее с чужого компьютера, а потом выходим, просто закрыв браузер, то это не совсем правильно. Такой способ не позволяет выйти из почты. Любой другой человек может открыть браузер и спокойно сидеть в вашей почте. Просто там «висит» ваша кука с вашим логином и паролем, которые запомнились на компьютере. Так вот для более умных и продвинутых людей, там есть кнопка – «Выход». Вот она и позволяет полностью выйти из вашей почты и при этом удалит куку с вашем логином и паролем. Теперь вопрос в следующем – как убить принудительно куку в PHP? А нужно всего лишь послать куку с одним параметром – с именем куки – это официальный вариант:

<?php
setcookie("TestCookie");
?>

Конечно, есть еще варианты убиения кук, но это уже из области паранойи. Однако вы можете с ними столкнуться. Вот эти варианты:

<?php
/* оставляем второй параметр пустым */
setcookie("TestCookie", "");
?> 
<?php
/* 
оставляем второй параметр пустым,  
переводим время на час назад 
*/
setcookie("TestCookie", "", time()-3600);
?>

Ну вот в принципе и все, что нужно знать про куки в PHP.

Ну и в заключении давайте выполним небольшое задание. Задание будет заключаться в следующем – если пользователь приходит к нам в первый раз, мы ему говорим «Добро пожаловать!» Когда он приходит все последующие разы, мы ему говорим «Вы пришли к нам такой-то раз!» и пишем, когда он был последний раз. То есть нам нужно будет посылать ему две куки. В первой куки мы делаем счетчик, а во второй ставим время.

Итак, вот решение нашей задачи:

<?php
/* 
создаем переменную счетчик и присваиваем
значение ноль
*/

$counter = 0;

/*
проверяем,  есть ли такая кука со счетчиком.
если да, присваиваем значение этой куки переменной счетчику
*/

if(isset($_COOKIE['counter']))
	$counter = $_COOKIE['counter'];
	
/* каждый раз увеличиваем счетчик на единицу */

$counter++;

/*
проверяем, если ли кука с временем последнего посещения.
если да, присваиваем эту куку переменной
*/

if(isset($_COOKIE['time_last_visit']))
	$time_last_visit = $_COOKIE['time_last_visit'];
	
/* устанавливаем куки на всю жизнь */

setcookie("counter", $counter, 0x7FFFFFFF);
setcookie("time_last_visit", date("d-m-Y H:i:s"), 0x7FFFFFFF);

/* выводим куки */

if($counter == 1)
	echo "Добро пожаловать!";
else{
	echo "Вы пришли $counter раз!<br>";
	echo "Последнее посещение $time_last_visit";
}
?>

Видео лучше смотреть в полноэкранном режиме в качестве 720 HD.

Буду благодарен, если поделитесь этой статьей в социальных сетях:
Share on Google+
Буду очень признателен, если поставите лайк:
Присоединяйтесь ко мне в следующих сервисах:
youtube
Буду очень рад, если добавитесь ко мне в друзья ВКонтакте! Отзывы о блоге оставляйте на стене моего аккаунта:

Комментариев к статье: 1

  1. Сергей:

    Думаю печеньки потому что следы оставляют, крошки тобиш

Оставить комментарий:

Это не спам (обязательно)

Яндекс.Метрика

Рейтинг@Mail.ru