В избранное    Домой    Карта сайта          Adminka

Среда,  13 Dec 2017 г., 07:35
Господь -- пастырь мой; я ни вчём не буду нуждаться: Он покоит меня на злачных пажитях и выводит меня к водам тихим, Подкрепляет душу мою, направляетменя на стези правды ради имени Своего. /Псалом 22 (ст. 1- 3)/

 Логин:  

 Пароль: 




Анонсы:
=== Дата: 22/08/2011     Автор: Крис Ньюман ===

PHP. Урок 14 Данные cookies и сеансы

Урок 14. Данные cookies и сеансы

В этом уроке рассматриваются механизмы обмена информацией между страницами Web-сайта без использования форм. Это данные cookies и PHP-сеансы.

Файлы Cookies

Файлы cookies – это маленькие кусочки информации, которые сохраняются в пользовательском браузере. Обычно в них хранится информация, которая используется для идентификации пользователя. Она позволяет индивидуально настроить Web-сайт под каждого посетителя.

Вместо того чтобы каждый раз отправлять данные через форму или как параметр URL, данные cookies автоматически возвращаются в сценарий пользовательским браузером. Даже после окончания работы с сайтом и перехода на другой, эти данные могут храниться до следующего посещения.

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

Составляющие cookies

Параметр cookie состоит из имени и значения, как обычная переменная PHP. Сервер отправляет инструкцию создать значение cookie браузеру при помощи специального HTTP-заголовка. Это выполняется до отправки содержимого страницы. Встречая такой заголовок, который создает cookie, браузер выполняет соответствующее действие.

HTTP-заголовок, который создает cookie, имеет одинаковый вид, независимо от того, какими средствами он генерируется. Это может быть PHP или другой механизм Web-сервера. Создадим заголовок, который создает cookie под названием email:

Set-Cookie: email=chris@lightwood.net

У данных cookies есть определенное время жизни. Некоторые существуют до закрытия окна браузера и хранятся в оперативной памяти компьютера. Другие имеют фиксированное время жизни и теряют актуальность в определенный момент. Они хранятся на жестком диске. Следующий HTTP-заголовок создает cookie email, который заканчивается в конце 2005 года:

Set-Cookie: email=email=chris@lightwood.net;
      expires=Sat, 31-Dec-2005 23:59:59 GMT

Eсли не указать атрибут expires в заголовке Set-Cookie, значение cookie автоматически уничтожается при закрытии окна браузера.

Кроме того, существуют дополнительные атрибуты — имя домена и путь, куда браузер будет возвращать значение cookies. При повторном посещении страницы, для которой установлены cookies, браузер посылает эти значения обратно на Web-сервер.

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

Заголовок ниже создает cookie email. Его значение отправляется на любой поддомен lightwood.net, если запрашивается страница из каталога /scripts:

Set-Cookie: email=email=chris@lightwood.net;
      domain=.lightwood.net;
      path=/scripts

Поддомены. Атрибут cookies domain можно установить либо для домена из которого они отправляются, либо для всех поддоменов домена из которого они отправляются. Для этого нужно использовать формат .ваш_домен.com.
Это защитный механизм. Он позволяет избежать влияния одного сайта на другие. Например, нельзя установить cookies для домена www.php.net из любых Web-сайтов, которые не размещены на сервере php.net.

Доступ к значениям cookies

Суперглобальный массив $_COOKIE содержит все данные cookies, которые браузер отправляет для сценария. Данные cookies передаются обратно на Web-сервер с помощью HTTP-заголовков. На основе этой информации PHP создает массив $_COOKIE.

Получить доступ к значению cookie можно также, как и к данным формы. Например, в следующем выражении выводится текущее значение cookie email:

echo $_COOKIE[“email”];

Иногда с данными cookies возникает неразбериха. Тогда можно создать простой сценарий, который покажет все значения на экране. Это позволяет быстро обнаружить проблему. Вот простой пример:

echo “<PRE>”;
print_r ($_COOKIE);
echo “</PRE>”;

Создание cookies с помощью PHP

Выше упоминался способ создания данных Cookie с помощью HTTP-заголовков. Но этим способом пользуются мало. Дело в том, что в PHP есть специальная функция, которая выполняет это значительно проще:

setcookie(“email”, “chris@lightwood.net”, time() + 3600);

Здесь не нужно использовать строгий формат даты. Время жизни для cookie можно задать в формате временной метки Unix. Это позволяет установить нужное время жизни на фиксированный отрезок времени или до определенного момента в будущем.

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

Два следующих параметра используются для того, чтобы задать имя домена и путь для cookies. Иногда нужно установить имя домена и путь, но не задавать время жизни. Для этого нужно установить NULL для третьего аргумента:

setcookie(“email”, “chris@lightwood.net”, NULL,
    “.lightwood.net”, “/scripts”);

Последний необязательный аргумент setcookie – это флаг, который устанавливает для браузера безопасный режим передачи данных cookies. Для этого используется зашифрованное SSL-соединение с Web-сервером. На это указывает то, что адрес страницы начинается с https://.

Сохранение пароля в файлах cookies. Иногда может возникнуть соблазн сохранять пароль в cookies, чтобы автоматически авторизироваться при очередном посещении. Это небезопасно, даже если установлен флаг secure.
Значения cookies хранятся в файле как обычный текст. Их можно увидеть, просмотрев содержимое файла на жестком диске. Многие программы-шпионы пытаются выкрасть значения пароля, который находится в файлах cookies.

Удаление cookies

В PHP нет функции unsetcookie, которая бы позволяла удалить данные cookies. Но это можно сделать с помощью функции setcookie. Для этого нужно задать пустое значение и время жизни, которое уже прошло.

В примере ниже удаляется значение cookie email. Для этого время жизни устанавливается на час назад от текущего момента:

setcookie(“email”,””,time()-3600);

Изменение значений cookie. Чтобы удалить или установить новое значение данных cookies, нужно аргументы domain, path и ssl-only оставить такими же, как и при первом создании.

Сеансы

Сеансы напоминают cookies, потому что тоже позволяют передавать значения между страницами Web-сайта. Но вместо того, чтобы хранить все значения на каждом Web-браузере, Web-сервер хранит все данные у себя. Браузер получает только одно значение cookie для идентификации. По этому идентификатору PHP определяет, какие значения относятся к данному пользователю.

Так как браузер и Web-сервер обмениваются только одним значением, сеансы более эффективны, чем cookies, для хранения больших массивов данных.

Открытие сеанса

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

Вызов функции session_start создает новый сеанс:

session_start();

Суперглобальный массив $_SESSION хранит все значения переменных сеанса. В отличие от других суперглобальных массивов, которые рассматривались выше, $_SESSION позволяет напрямую присвоить значение. После этого оно становится доступным во всех сценариях, которые используют этот сеанс.

Рассмотрим сценарий в листинге 14.1, где устанавливаются две переменные сеанса — счетчик посещений страницы и дата последнего визита в формате временной метки.

Листинг 14.1. Использование переменных сеанса для подсчета количества обращений к странице


<?php
session_start();
if ($_SESSION[“last_visit”]) {
    echo “Дата последнего посещения: ”;
    echo date(“j F Y, H:i:s”, $_SESSION[“last_visit”]);
    echo “<br>”;
    echo “Всего посещений: ” . $_SESSION[“num_visits”];
}
else {
    echo “Вы впервые на этой странице”;
}
$_SESSION[“last_visit”] = time();
$_SESSION[“num_visits”]++;
?>

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

Использование переменных сеанса

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

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

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

Листинг 14.2. Использование массива в переменных сеанса


<?php
session_start();
if (isset($_POST[“word”])) {
    $_SESSION[“words”][] = $_POST[“word”];
}

if (is_array($_SESSION[“words”])) {
    foreach($_SESSION[“words”] as $word) {
        echo $word . “<br>”;
    }
}

?>
<FORM ACTION=”list.php” METHOD=POST>
Введите слово: <INPUT SIZE=”10” NAME=”word”>
<INPUT TYPE=SUBMIT VALUE=”Добавить слово в список”>
</FORM>

Резюме

В этом уроке вы узнали, как установить значения cookies из PHP для хранения значений. В следующем уроке вы узнаете, как создать систему аутентификации пользователя на основе этих механизмов.

Комментарии к статье (0)


<<назад

Погода в Рудне
(Волгоградcкая обл.)

Подробнее >>


Курс валют
на 13 Дек 2017 г.
DKK - 93,1732
USD - 58,8370

MainLink