Сделай Сам Свою Работу на 5

Механизм работы с сессиями





 

Для идентификации пользователя используется идентификатор сессии – SID. Именно с его помощью можно определить, какой пользователь запустил сценарий. Идентификатор сессии хранится в Cookies броузера. Фактически, SID – это имя временного хранилища, то есть имя временного файла, в котором PHP хранит информацию о сессии. Обычно эти файлы размещаются в каталоге /tmp.

Любая сессия открывается с помощью функции session_start(), создающей специальный служебный файл с именем, соответствующим ID сессии, в который впоследствии будут записаны все данные, связанные с текущей сессией. Место размещения этих файлов зависит от настроек PHP.

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

В PHP предусмотрено два способа передачи ID сессии (сокращенно SID):

· Через метод GET. Тогда посетитель будет видеть в своем браузере адресную строку следующего типа:

 

http://server.com/main.php?PHPSESSID=bdd95bcd4e1e2ef5ec57fc83a69bba86

 

· Через Cookie. Здесь, соответственно, посетитель не будет видеть признаков существования сессии, SID передается через Cookie.



 

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

Регистрация данных в сессию должна выглядеть примерно следующим образом (пример 5.4.1.1):

 

<?

session_name("SESS1");

session_start();

$_SESSION["a"]=$a;

$a=$a+1;

echo "<html><body>Нажмите Reload, чтобы увеличить счетчик";

echo "<br>Счетчик: $a";

echo "</body></html>";

?>

 

Функция session_start() инициализирует сессию, а $_SESSION["a"]=$a; регистрирует в сессии переменную $a. Если запустить скрипт и несколько раз нажать кнопку браузера Reload, счётчик будет увеличиваться, а если закрыть окно браузера, счетчик обнулится.

Следует также отметить, что скрипт, которые одновременно выполняются, ничего не знают друг о друге. Другими словами, если вы запустите скрипт и пару раз нажмете на кнопку Reload для изменения счётчика, а потом, не закрывая окна браузера, запустите браузер снова и запустите еще раз этот же скрипт – значение счётчика будет нулевым (в данном случае – 1).



Проверить, зарегистрирована ли переменная в сессии, позволяет выражение if (isset($_SESSION['var'])). Отменить регистрацию какой-нибудь переменной можно с помощью unset($_SESSION['var']).

Теперь рассмотрим еще один пример из жизни. Предположим, вы написали какой-нибудь скрипт с использованием сессий, предположим ту же анкету, и зарегистрировали в нем переменную FirstName. Предположим, пользователь заполняет аналогичную анкету другого разработчика и в ней также используется переменная FirstName – значения переменных перемешаются. Чтобы избежать этого, нужно присвоить нашей сессии какое-нибудь имя, например, SESS1. Это можно сделать с помощью функции session_name(). Функцию session_name() нужно вызвать ДО инициализации сессии. Если имя сессии не указано, PHP будет использовать имя сессии по умолчанию – PHPSESID.

 

Пример 5.4.1.2:

 

<?

session_name("SESS1");

session_start();

?>

 

Имя сессии – это название группы сессии, к которой принадлежит какой-нибудь SID.

Функция session_id([string $sid]) возвращает значение идентификатора сессии. Эта функция может также и изменить текущий SID, если указать параметр $sid.

Ещё одна полезная функция – session_save_path([string $path]). Она возвращает имя каталога, в котором будут находится временные файлы сессии. Обычно это каталог /tmp. С помощью параметра $path можно указать другой каталог.

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



 

Использование сессий без Cookies

 

По статистике, около 20% пользователей отключают Cookies. Желательно предусмотреть и этот вариант. Перед выполнением следующего примера отключите Cookies в вашем броузере, если это не сделать, то PHP будет использовать Cookies и пример будет несколько не так работать.

 

Пример 5.4.2.1:

 

<?

session_name("SESS1");

session_start();

$_SESSION["a"]=$a;

$a=$a+1;

echo "<html><body>Нажмите Reload, чтобы увеличить счетчик";

echo "<br>Счетчик: $a";

?>

<a href=sesq.php?<?=SID?>>Click here</a>";

 

Обратите внимание на последнюю ссылку: при отключенных Cookies PHP генерирует константу SID. Если Cookies включены, данная константа ничего не содержит. Для работы скрипта первый раз нужно перейти по этой ссылке вместо нажатия на Reload. Потом уже можно будет нажимать и на Reload.

При использовании константы SID интерпретатору PHP кажется, что данные об идентификаторе и имени сессии пришли из Cookies браузера.

 

Обработчики сессий

 

PHP позволяет переопределить стандартные обработчики сессий, если они почему-то вас не устраивают.

Ниже описаны все стандартные обработчики сессии PHP:

 

session_handler_open(string $save_path, string $session_name)

 

Данный обработчик вызывается при инициализации сессии, то есть, когда вызывается функция session_start(). Обычно этот обработчик открывает базу данных (или какой-нибудь файл) для группы сессий $session_name.

 

session_handler_close()

 

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

 

session_handler_read(string $sid)

 

Функция вызывается, когда нужно прочитать данные сессии. В качестве параметра передается идентификатор сессии – $sid.Функция возвращает данные сессии в формате: name1=value1;name2=value2;...;nameN=valueN; Под значением подразумевается сериализированные с помощью функции Serialize данные. Например, var1|i:10;var2|i:20, в сессии были сохранены две переменные – var1 и var2. Значение первой – 10, второй – 20.

 

session_handler_write(string $sid, string $data)

 

Функция предназначена для записи данных сессии с указанным идентификатором. Параметр $data задается в вышеописанном формате.

session_handler_destroy(string $sid) Этот обработчик вызывается перед уничтожением сессии.

 

session_handler_gc(int $maxlifitime)

 

Обработчик handler_gc вызывается после того, как сценарий завершил свою работу. Если пользователь окончательно «ушел» с вашего сервера, PHP должен удалить данные сессии. Вот именно для это и предназначена функция handler_gc. Параметр $maxlifetime – максимальное время существования сессии в секундах.

 

Для переопределения обработчиков используется функция

 

session_set_save_handler($open,$close,$read,$write,$destroy,$gc)

 

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

Пример переопределения обработчиков (пример 5.4.3.1):

 

<?

function open ($save_path, $session_name)

{

echo "open ($save_path, $session_name)\n";

return true;

}

 

function close()

{

echo "close\n";

return true;

}

 

function read ($key)

{

echo "write ($key, $val)\n";

return "foo|i:1;";

}

 

function write ($key, $val)

{

echo "write ($key, $val)\n";

return true;

}

 

// Ничего не делает

function destroy ($key)

{

return true;

}

 

// Ничего не делает

function gc ($maxlifetime)

{

return true;

}

 

session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");

 

session_start();

$foo++;

?>

 

 

Тема 6. HTTP-заголовки. Работа с cookies в PHP

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.