МИР_09_PHP.ppt
- Количество слайдов: 50
Мировые информационные ресурсы Лекция 9. Cookie и отслеживание сеанса
Преимущества отслеживания пользовательских данных содержание сайта настраивается в соответствии с предпочтениями пользователя из сайта исключается бесполезная или не представляющая интереса информация. для администратора сайта отслеживание пользовательских предпочтений открывает возможности целевого маркетинга и анализа популярности материалов сайта. Концепция «наблюдения» за пользователем в процессе перемещения по сайту обычно называется «отслеживанием сеанса» (session tracking). 2
Cookie - представляет собой небольшой пакет информации, переданный web-сервером и хранящийся на клиентском компьютере. - в cookie можно сохранить полезные данные, описывающие состояние пользовательского сеанса, чтобы в будущем загрузить их и восстановить параметры сеансовой связи между сервером и клиентом. - вследствие того, что cookie обычно связываются с конкретным пользователем, в них часто сохраняется уникальный идентификатор пользователя (UIN), который заносится в базу данных на сервере и используется в качестве ключа для выборки из базы всей информации, связанной с этим идентификатором. - общий объем cookie не превосходит 4 Кбайт (4096 байт). 3
Компоненты cookie Имя cookie - является обязательным параметром, по которому программа ссылается на cookie. Можно провести аналогию между именем cookie и именем переменной. Значение - фрагмент данных, связанный с именем cookie. В этих данных может храниться любая информация — идентификатор пользователя, цвет фона, текущая дата и т. д. Срок действия - дата, определяющая продолжительность существования cookie. Как только текущая дата и время превосходят заданный срок действия, cookie становится недействительным и перестает использоваться. В соответствии со спецификацией cookie устанавливать срок действия для cookie необязательно. Но средства РНР для работы с cookie требуют, чтобы срок действия устанавливался, иначе cookie становится недействительным в конце сеанса (то есть когда пользователь покидает сайт). 4
Компоненты cookie Домен - домен, который создал cookie и может читать его значение. - Если домен состоит из нескольких серверов и доступ к cookie должен быть разрешен всем серверам, то имя домена можно задать в форме. site. ru. В этом случае все потенциальные домены третьего уровня, принадлежащие сайту site. ru (например, wap. site. ru или news. site. ru), смогут работать с cookie. - по соображениям безопасности cookie могут устанавливаться только для домена сервера, пытающегося создать cookie. - Данный компонент необязателен; если он не указан, по умолчанию используется имя домена, из которого было получено значение cookie. 5
Компоненты cookie Путь - URL, с которого предоставляется доступ к cookie. Любые попытки получения доступа к cookie за пределами этого пути пресекаются. - Данный компонент необязателен; если он не задан, по умолчанию используется путь к документу, создавшему cookie. Безопасность - параметр, показывающий, допускается ли чтение cookie в небезопасной среде. По умолчанию используется значение FALSE. 6
Компоненты cookie Хотя при создании cookie используются одни и те же синтаксические правила, формат хранения cookie зависит от браузера. Чтобы просмотреть cookie, сохраненные браузером, достаточно открыть их в любом текстовом редакторе. Internet Explorer сохраняет свои cookie в папке с именем «Cookies» , a Netscape Communicator использует для этой цели один файл с именем cookies. Некоторые браузеры ограничивают количество создаваемых cookie. 7
Функция setcookie( ) - сохраняет cookie на компьютере пользователя. Синтаксис: setcookie (имя [значение [, дата [, путь [, домен [, безопасность]]]]]) Значение cookie должно устанавливаться до передачи в браузер любой другой информации, относящейся к странице. Невозможно создать cookie и использовать его на той же странице. Пример: $userid = "4139 b 31 b 7 bab 052"; $cookie_set = setcookie ("uid", $userid, time()+3600, "/", ". site. ru", 0); После перезагрузки или перехода на другую страницу становится доступной переменная $userid, содержащая идентификатор 4139 b 31 b 7 bab 052. Срок действия cookie истекает ровно через один час (3600 секунд) после отправки. После истечения этого срока cookie становится недействительным. Доступ к cookie разрешен только из домена site. ru. Разрешен доступ к cookie через небезопасный протокол. 8
Функция setcookie( ) Пример: сохранение цвета фона, выбранного пользователем // Если переменная $bgcolor существует if (isset($bgcolor)) : setcookie("bgcolor", $bgcolor, time()+3600); ? >
method=="post"> Ваш любимый фоновый цвет?" src="https://present5.com/presentation/3737549_48585645/image-10.jpg" alt="Функция setcookie( )
Имена cookie как элементы массива Пример: setcookie("example[uid]", "4139 b 31 b 7 bab 052", time( )+3600); setcookie("example[color]", "black", time( )+3600); setcookie("example[preference]", "english", time. O+3600); if (isset($example)): while (list ($name, $value) = each ($example)): echo "$name = $value n"; endwhile; endif; ? > В результате выполнения этого фрагмента будет выведен следующий результат (а на клиентском компьютере будут созданы три cookie): uid = 4139 b 31 b 7 bab 052, color = black, preference = english 11
Применение cookie Cookie применяются для хранения числовых идентификаторов (UIN), по которым в дальнейшем на сервере производится выборка информации, относящейся к данному пользователю. Сохраненные данные впоследствии используются для настройки параметров форматирования страницы. Пример: имеется таблица userjnfo в базе данных с именем user. В ней хранятся атрибуты пользователя: идентификатор, имя и адрес электронной почты пользователя: mysql>create table user_info ( ->user_id char (18), ->fname char(15), ->email char(35)); Чтобы пользователю не приходилось вводить всю информацию заново, идентификатор загружается из cookie на клиентском компьютере. 12
Применение cookie if (! isset($userid)) : $id = 15; setcookie ("userid", $id, time( )+3600); print "A cookie containing your user. ID has been set on your machine. Please refresh the page to retrieve your user information"; else: @mysql_connect("localhost", "web", "4 tf 9 zzzf") or die("Could not connect to My. SQL server!"); @mysql_select_db("user") or die("Could not select user database!"); 13
Применение cookie $query = "SELECT * FROM users 13 WHERE user_id = '$userid'"; $result = mysql_query($query)l; // Если совпадение найдено, вывести данные пользователя. if (mysql_num_rows($result) == 1) : $row = mysql_fetch_array($result); print "Hi ". $row["? name"]. ", "; print "Your email address is ". $row[ "email"]; else: print "Invalid User ID!"; endif; mysql_close(); endif; ? > 14
Уникальные идентификаторы Функция uniqid( ) - генерирует уникальный идентификатор из 13 символов, значение которого основано на текущем времени. Синтаксис: uniqid(префикс [, дополнение]) В параметре префикс передается строка, с которой должен начинаться UIN. Поскольку этот параметр является обязательным, при вызове необходимо передать хотя бы пустую строку. Если необязательный параметр дополнение равен TRUE, функция uniqid( ) генерирует UIN из 23 символов. 15
Уникальные идентификаторы Чтобы быстро создать уникальный идентификатор, достаточно при вызове uniqid( ) передать один параметр — пустую строку: $uniq_id = uniqid(" "); Генерируется строка из 13 символов - например: '39 b 3209 ce 8 ef 2' В другом варианте сгенерированное значение присоединяется к строке, определяемой параметром префикс: $uniq_id = uniqid("php", FALSE): // Генерируется строка из 16 символов - например: 'php 39 b 3209 ce 8 ef 2' 16
Уникальные идентификаторы Поскольку uniqid( ) генерирует UIN на основании текущего времени, существует вероятность того, что идентификатор удастся подобрать. Чтобы значение идентификатора было действительно случайным, можно предварительно сгенерировать префикс при помощи функции РНР rand( ). srand((double) microtime( ) * 1000000); $uniq_id = uniqid(rand( )); Функция srand( ) инициализирует генератор случайных чисел. Передача rand( ) в качестве параметра uniqid( ) приводит к тому, что функция uniqid( ) вызывается с заранее сгенерированным случайным префиксом, что усложняет подбор сгенерированного UIN. 17
Уникальные идентификаторы Пример: регистрация пользователей При первой загрузке сценария пользователю предлагается заполнить короткую форму с именем и адресом электронной почты. Эта информация вместе со сгенерированным уникальным идентификатором сохраняется в таблице user_info, определение которой приведено выше. Cookie с этим идентификатором сохраняется на компьютере пользователя. При всех последующих посещениях сценарий ищет в базе данных уникальный идентификатор, взятый из cookie, и выводит в браузере найденную информацию о пользователе. 18
Уникальные идентификаторы Пример: регистрация пользователей Принципиально возможны три ситуации: Пользователь не заполнял форму и не имеет cookie. В этом случае он должен заполнить форму. Пользователь заполнил форму, но cookie еще не создано. В этом случае информация пользователя сохраняется в базе данных и создается cookie со сроком действия один месяц. Пользователь возвращается после предыдущих посещений. Если срок действия cookie еще не истек, сценарий читает идентификатор пользователя и загружает соответствующую информацию из базы данных. 19
Ваше" src="https://present5.com/presentation/3737549_48585645/image-20.jpg" alt="Уникальные идентификаторы $form = "
Уникальные идентификаторы // Если форма еще не отображалась if ((! isset ($seenform)) && (! isset ($userid))) : print $form; // Если форма отображалась, но данные пользователя еще не обработаны elself (isset ($seenform) && (! isset ($userid))) : srand ((double) microtime( ) * 1000000); $uniq_id = uniqid(rand( )); @mysql_pconnect("localhost", "root", "") or die("Невозможно подключиться к серверу My. SQL"); @mysql_select_db("users") or die("Не выбрана база данных"); 21
Уникальные идентификаторы $query = "INSERT INTO user_info VALUES('$uniq_id', '$fname', '$email')"; $result = mysql_query($query) or die("Вставка невозможна!"); setcookie ("userid", $uniq_id, time( )+2592000); print "Регистрация $fname успешно завершена"; elseif (isset($userid)) : @mysql_pconnect("localhost", "root", "") or die("Невозможно подключиться к серверу My. SQL"); @mysql_select_db("users") or die("Не выбрана база данных"); 22
Уникальные идентификаторы $query = "SELECT * FROM user_info WHERE user_id = '$userid' "; $result = mysql_query($query) or die("Не найдены данные пользователя"); $row = mysql_fetch_array($result); print "Уважаемый ". $row["fname"]. ", "; print "Ваш e-mail: ". $row["email"]; endif; ? > 23
Отслеживание сеанса Сеансом (session) называется период времени, который начинается с момента прихода пользователя на сайт и завершается, когда пользователь покидает сайт. При входе на сайт пользователю присваивается уникальный идентификатор сеанса (SID), который сохраняется на компьютере пользователя в cookie с именем PHPSESSID. Если использование cookie запрещено или cookie вообще не поддерживаются, SID автоматически присоединяется ко всем локальным URL на протяжении сеанса. В то же время на сервере сохраняется файл, имя которого совпадает с SID. По мере того как пользователь перемещается по сайту, значения некоторых параметров должны сохраняться в виде сеансовых переменных. Эти переменные сохраняются в файле пользователя. При последующем обращении к сеансовой переменной сервер открывает сеансовый файл пользователя и ищет в нем нужную переменную. 24
Конфигурация РНР enable-trans-id Если РНР компилируется с этим флагом, ко всем относительным URL автоматически присоединяется идентификатор сеанса (SID). Дополнение записывается в формате имя_сеанса=идентификатор_сеанса, где имя_сеанса определяется в файле php. ini. Если не включать этот флаг, в качестве SID можно использовать константу. track_vars Установка флага track_vars позволяет использовать массивы $HTTP_*_VARS[ ], где * заменяется одним из значений EGPCS (Environment, Get, Post, Cookie, Server). Данный флаг необходим для того, чтобы значения SID передавались с одной страницы на другую. 25
Конфигурация РНР register_globals В результате установки этого флага все переменные EGPCS становятся доступными глобально. Если нежелательно, чтобы массив глобальных переменных заполнялся данными, которые не понадобятся, флаг следует сбросить. Если флаг register_globals сброшен, а флаг track_vars установлен, ко всем переменным GPC можно обращаться через массив $HTTP_*_VARS[]. Например, если сбросить флаг register_globals, к стандартной переменной $PHP_SELF придется обращаться в виде $HTTP_SERVER_VARS["PHP_SELF"]. 26
Сеансовые директивы в файле php. ini session. save_handler = files Определяет способ хранения сеансовых данных на сервере. Возможны три варианта: в файле (files), в общей памяти (mm) или с использованием функций, определяемых пользователем (User). Последний вариант позволяет легко сохранить информацию в любом формате — например, в базе данных. session. save_path =/tmp Определяет каталог для сеансовых файлов РНР. На платформе Linux обычно используется значение по умолчанию ('/tmp'). На платформе Windows следует указать путь к какому-нибудь каталогу, в противном случае произойдет ошибка. 27
Сеансовые директивы в файле php. ini session_use_cookies =1 При установке этого флага для сохранения идентификатора сеанса на компьютере пользователя используются cookie. session. name =PHPRESSID Если флаг session. use_cookies установлен, то значение session. name используется в качестве имени cookie. Имя может состоять только из алфавитно-цифровых символов. session. auto_start = 0 При установке флага session. auto_start сеанс автоматически инициируется при первоначальном запросе со стороны клиента. 28
Сеансовые директивы в файле php. ini session. cookie_lifetime = 0 Если флаг session. use_cookies установлен, то значение session. cookie_lifetime определяет срок действия отправляемых cookie. Если параметр равен 0, то все cookie становятся недействительными при завершении сеанса session. cookie_path = / Если флаг session. use_cookies установлен, то значение session. cookie_path определяет каталог, для которого отправляемые cookie считаются действительными session. cookie_domain = Если флаг session. use_cookies установлен, то значение session. cookie_domain определяет домен, для которого отправляемые cookie считаются действительными 29
Сеансовые директивы в файле php. ini session. serialize_handler = php Имя обработчика, используемого в процессе сериализации данных. В настоящее время определены два возможных значения: php и WDDX. session. gc_probability =1 Вероятность активизации сборщика мусора РНР (в процентах) session. gc_maxlifetime=1440 Промежуток времени (в секундах), по истечении которого данные сеанса считаются недействительными и уничтожаются. Отсчет начинается с момента последнего обращения пользователя в текущем сеансе 30
Сеансовые директивы в файле php. ini session. referer_check = Если этому параметру присвоено строковое значение, каждый запрос к странице при включенном отслеживании сеанса начинается с проверки того, что заданная строка присутствует в глобальной переменной $HTTP_REFERER. Если строка не найдена, идентификаторы сеансов игнорируются. session. enthropy_file = Ссылка на внешний файл с дополнительной случайной информацией, используемой при генерации идентификаторов сеансов. В системах UNIX для этой цели обычно используются два устройства: /dev/random и /dev/urandom. Устройство /dev/random получает случайные данные от ядра, а устройство /dev/urandom генерирует случайную строку при помощи хэшалгоритма М 05. Поэтому /dev/random работает быстрее, a 31 /dev/urandom генерирует «более случайные» строки
Сеансовые директивы в файле php. ini session. enthropy_length = 0 Если флаг session. enthropy_file установлен, то session. enthropy_length определяет количество байт, читаемых из файла session. enthropy_file. session. cache_limiter = nocache Способ управления кэшем для страниц сеанса. В настоящее время определены три возможных значения: nocache, public и private. session. cache_expire =180 Продолжительность жизни кэшированных страниц сеанса (в минутах). 32
Функция session_start( ) - имеет двойное назначение: проверяет, начал ли пользователь новый сеанс, и если нет — начинает его. Синтаксис: session_start() - выполняет три операции: назначение пользователю SID, отправку cookie (если в файле php. ini установлен флаг session_cookies) и создание файла сеанса на сервере. - информирует ядро РНР о возможности использования в сценарии, в котором она была вызвана, сеансовых переменных. - возвращает TRUE независимо от результата. Следовательно, проверять ее в условиях if или в команде die( ) бессмысленно. 33
Функция session_destroy( ) - уничтожает все хранимые данные, относящиеся к сеансу текущего пользователя. Синтаксис: session_destroy( ) - функция не уничтожает cookie на браузере пользователя. Пример: session_start( ); // Выполнить некоторые действия для текущего сеанса session_destroy( ): ? > 34
Функция session_id( ) - возвращает SID для сеанса, созданного функцией session_start( ). Синтаксис: session_id ([sid]) Если в необязательном параметре передается идентификатор, то значение SID текущего сеанса изменяется. При этом cookie заново не пересылаются. Пример: session_start(); print "Идентификатор вашего сеанса ". session_id( ); session_destroy( ); ? > Результат: Идентификатор вашего сеанса 067 d 992 a 949114 ee 9832 flcllcafc 640 35
Функция session_register( ) - регистрирует имена одной или нескольких переменных для текущего сеанса. Синтаксис: session_register (имя_переменной 1 [, имя_переменной 2. . . ]) Если сеанс не существует, функция session_register( ) также неявно вызывает session_start( ) для создания нового сеанса. 36
Функция session_is_registered( ) - определяет, была ли ранее зарегистрирована переменная с заданным именем. Синтаксис: session_is_registered (имя_переменной) Пример: Счетчик посещений сайта пользователем session_start( ); if (! session_is_registered('hits')): session_register( 'hits' ); endif; $hits++; print "Вы посетили страницу $hits раз. "; ? > 37
Функция session_unregister( ) - сеансовые переменные уничтожаются. Синтаксис: session_unregister (имя_переменной) Пример: session_start() session_register('username'); // Использовать переменную $username. . // Когда переменная становится ненужной - уничтожить ее. session_unregister('username'); session_destroy(); ? > 38
Функция session_encode( ) - обеспечивает чрезвычайно удобную возможность форматирования сеансовых переменных для хранения (например, в базе данных). Синтаксис: session_encode( ) В результате выполнения этой функции все сеансовые данные форматируются в одну длинную строку, которую можно сохранить в базе данных. Пример: session_register('bgcolor'); session_register('fontcolor'); // Переменная $usr_id хранится в cookie на компьютере пользователя. $id = session_id($usr_id); 39
Функция session_encode( ) // Значения следующих переменных могут задаваться пользователем в форме HTML $bgcolor = "white"; $fontcolor = "blue"; // Преобразовать все сеансовые данные в одну строку $usr_data = session_encode( ); @mysql_pconnect("localhost", "web", "4 tf 9 zzzf"); @mysql_select_db("users"); // Обновить пользовательские параметры страницы $query = "UPDATE user_info set page_data='$usr_data' WHERE user_id= '$id'"; $result = mysql_query($query); ? > 40
Функция session_decode( ) - восстанавливаются все сеансовые данные, ранее преобразованные в строку функцией session_encode( ). Синтаксис: session_decode (сеансовые_данные) В параметре сеансовые_данные передается преобразованная строка сеансовых переменных, возможно — прочитанная из файла или загруженная из базы данных. Строка восстанавливается, и все сеансовые переменные в строке преобразуются к исходному формату. 41
Функция session_decode( ) Пример: таблица My. SQL с именем user_info состоит из двух полей: user_id и page_data. Пользовательский UID, хранящийся в cookie на компьютере пользователя, применяется для загрузки сеансовых данных, хранящихся в поле page_data. В этом поле хранится закодированная строка переменных, одна из которых ($bgcolor) содержит цвет фона, выбранный пользователем. $id = session_id($usr_id); @mysq]_pconnect("localhost", "web", "4 tf 9 zzzf"); @mysql_select_db("users"); $query = "SELECT page_data FROM user_info WHERE user_id= '$id'", Sresult = mysql_query($query); $user_data = mysql_result($result, 0, "page_data"); session_decode($user_data); print "BGCOLOR: $bgcolor"; ? > 42
Функция session_set_save_handler( ) - определяет процедуры сохранения и загрузки сеансовых данных пользовательского уровня. Синтаксис: session_set_save_handler (open, close, read, write, destroy, go) Шесть параметров соответствуют шести функциям, вызываемым сеансовыми функциями РНР. Хотя имена этих функций могут быть произвольными, каждая функция должна получать жестко заданный набор параметров. Чтобы использовать функцию session_set_save_handler( ), необходимо присвоить параметру session. save_handler в файле php. ini значение user. 43
Функция session_set_save_handler( ) Параметры: sess_close( ) Вызывается при завершении сценария, в котором реализуются сеансовые функции. Вызывается без параметров. sess_destroy($идентификатор_ceaнca) Удаляет все сеансовые данные. Параметр определяет удаляемый сеанс. sess_gc($срок_действия) Удаляет все сеансы с завершенным сроком действия. Срок определяется параметром $срок_действия, значение которого задается в секундах. Параметр читается из файла php. ini и соответствует значению session. gc_lifetime 44
Функция session_set_save_handler( ) Параметры: sess_open($путь, $имя) Вызывается при инициализации нового сеанса функцией session_start( ) или session_register( ). Два параметра читаются из файла php. ini и соответствуют значениям session. save_path и session. name sess_read($ключ) Используется для выборки значения сеансовой переменной, определяемой заданным ключом sess_write($ключ, $значение) Используется для сохранения сеансовых данных. Любые данные, сохраненные функцией sess_write( ), позднее могут быть прочитаны функцией sess_read( ). Параметр $ключ соответствует имени сеансовой переменной, а параметр $значение — значению, 45 связываемому с заданным ключом
Функция session_set_save_handler( ) Пример: $host = "localhost"; $user = "web"; $pswd = "4 tf 9 zzzf"; $db = "users"; $session table = "user session data"; $sess_life = get_cfg_var("sess. gc_lifetime"); function mysql_sess_open($save_path. $session_name) { GLOBAL $host. $user, $pswd, $db; @mysql_connect($host, $user, $pswd) or die("Can't connect to My. SQL server!"); @mysql_select_db($db) or die("Can't select session database!"); } 46
Функция session_set_save_handler( ) function mysql_sess_close() { return true; } function mysql_sess_read($key) { GLOBAL $session_table: $query = "SELECT value FROM $session_table WHERE sess_key = '$key'"; $result = mysql_query( $query); if (list($value) = mysql_fetch_row($result)) : return $value; endif; return false; } 47
Функция session_set_save_handler( ) function mysql_sess_write($key, $val) { GLOBAL $sess_life, $session_table; $expiratlon = time() + $sess_life; $query = "INSERT INTO Ssession_table VALUES('$key', '$expiration', '$value')"; $result = mysql_query($query); if (! $result) : $query = "UPDATE $session_table SET sess_expiration = '$expiration', sess_value='Svalue' WHERE sess_key = '$key'"; $result = mysql_query($result); endif; } 48
Функция session_set_save_handler( ) function mysql_sess_destroy(Ssess_id) { GLOBAL $session_table: $query = "DELETE FROM $session_table WHERE sess_key = '$sess_id'"; $result = mysql_result($query); return $result; } 49
Функция session_set_save_handler( ) function mysql_sess_gc($max_lifetime) { GLOBAL $session_table; $query = "DELETE FROM $session_table WHERE sess_expiration < ". time(); $result = mysql_query($query); return mysql_affected_rows(); } session_set_save_handler("mysql_sess_open", "mysql_sess_close", "mysql_sess_read", "mysql_sess_write", "mysql_sess_destroy", "mysql_sess_gc"); ? > После того как эти шесть функций будут зарегистрированы в программе, их можно вызывать по абстрактным именам (sess_close( ), sess_destroy( ), sess_gc( ), sess_open( ), sess_read( ) или sess_write( 50 )).


