Программирование с нуля - это совсем просто! 98) Курс PHP: Сессии
Школа программирования
Разработка ролевой игры
98) Курс PHP: Сессии
Сегодня - продолжение курса по PHP. Последний выпуск на эту тему - N 95.
Сессии
Сессии - одно из наиболее важных понятий PHP. Они были реализованы непосредственно в самом языке, начиная с 4-й версии.
С помощью сессий удается организовывать длительные процессы общения с пользователем, сохраняя на протяжении такого процесса ранее заданные значения различных переменных внутри программы.
Например, мы решили создать программу интерактивного тестирования. Она последовательно задает человеку ряд вопросов, накапливая промежуточный итог в некоторой внутренней переменной, а по окончании теста выдает финальный результат, анализируя этот итог. Для этого нам надо организовать сессию и указать, какая переменная или какие переменные будут сохранять свои значения между каждым общением с браузером и получением ответа от него.
При этом PHP-программа автоматически отслеживает обращение к ней от конкретного клиентского приложения (браузера) и не путает сессии разных пользователей. То есть программисту можно составлять программу так, как будто она будет обслуживать не сотни и тысячи человек одновременно, а только одного! Это значительно упрощает реализацию различных интерактивных алгоритмов.
Начало сессии
Сессия начинается обращением к функции
session_start ();
Параметров у нее нету. Функция всегда возвращает true, поэтому результат ее вызова можно не проверять.
Данную команду можно выполнять несколько раз - PHP-среда выполнения на сервере автоматически отметит, была ли запущена сессия, и если сессия уже открыта, эта функция просто ничего не будет делать.
Регистрация переменной на всю сессию
После того, как сессия была открыта, функцией
session_register();
регистрируются переменные, значения которых не будут пропадать в процессе общения с конкретным пользователем.
В качестве параметра функции указывается список названий этих переменных в кавычках (без предварительного символа "$" !). Функция возвращает true, если все переменные удалось зарегистрировать в сессии.
Например:
session_register("x", "MyVal");
$x = 5;
Чтобы в дальнейшем к этим переменным можно было обращаться непосредственно по имени, надо указать в настройках PHP-сервера (файл php.ini) в строке register_globals значение On (включить).
Важно! Если данная функция вызывается внутри некоторого локального блока, то и область действия определяемых с ее помощью долгоживущих переменных на самом деле будет ограничен только этим блоком. Поэтому правильно вызывать session_register() вне каких-либо модулей { и }.
Проверка наличия регистрации
Функция
session_is_registered()
возвращает true, если переменная, указанная в качестве параметра (строка с именем переменной) уже была зарегистрирована в текущей сессии с помощью функции session_register().
session_is_registered() обычно применяется в такой шаблонной конструкции:
session_start();
if (!session_is_registered("my_variable"))
{
session_register("my_variable ");
$my_variable = начальное-значение;
}
Вместо my_variable подставляется название своей переменной.
При первом выполнении сценария функция session_is_registered("my_variable") вернет false (переменная my_variable еще не зарегистрирована), поэтому выполнится внутренняя часть условного оператора, где my_variable будет зарегистрирована. В этом же месте обычно всем регистрируемым в сессии переменным присваиваются начальные значения.
Далее при очередном выполнении данного сценария окажется, что сессия уже запущена (my_variable зарегистрирована), поэтому дальнейших обращений к внутреннему блоку условного оператора не произойдет.
Завершение сессии
Функция
session_destroy();
завершает текущую сессию. При этом все переменные, что были зарегистрированы при ее открытии, остаются доступными.
Пример.
Рассмотрим простейший пример организации сессионного взаимодействия с пользователем. Он может использоваться как шаблон для создания собственных интерактивных приложений.
Подготовим простую форму отправки значения PHP-сценарию.
Сценарию action.php введенное число будет передаваться в поле myvalue.
Допустим, нам требуется показывать как текущее число, так и самое первое, введенное человеком в первый раз. Для этого (для хранения самого первого числа), очевидно, потребуется режим сессии. Условимся, что хранить первое значение мы будем в переменной mytest.
<html>
<body>
<h1> Сессионный PHP-скрипт </h1>
<?php
// открываем сессию
session_start();
// проверяем, была ли в ней зарегистрирована переменная mytest: if ( ! session_is_registered("mytest") )
{ // нет еще - значит, надо
// зарегистрировать переменную сессии
// под названием mytest:
session_register("mytest");
// сразу в эту переменную занесем
// первое значение, полученное от формы:
// выводим значение, полученное в первый раз
// и сохраненное в переменной $mytest:
print "<p>В первый раз вы ввели: " ;
print $mytest;
?>
</body>
</html>
Точка вызова сессий
Важное замечание в отношении сессий заключается в том, что нередко их поддержка на разных серверах и виртуальных хостингах различается. В частности, могут разниться методы обработки HTTP заголовков, что приводит к неверной фиксации начала сессий.
Поэтому общий метод в отношении функции session_start() заключается в том, что вызов ее необходимо всегда размещать в самом начале PHP-сценария, до каких-либо команд формирования HTML-содержимого (например, print), а также ранее любого HTML-кода. Так, пример предыдущего занятия с учетом этой особенности и рассмотренной возможности разделения PHP-текста на сценарный код и HTML может быть так переписан:
<?php
// открываем сессию
session_start();
?>
<html>
<body>
<h1> Сессионный PHP-скрипт </h1>
<?php
// проверяем, была ли в ней зарегистрирована переменная mytest: if ( ! session_is_registered("mytest") )
{ // нет еще - значит, надо
// зарегистрировать переменную сессии
// под названием mytest:
session_register("mytest");
// сразу в эту переменную занесем
// первое значение, полученное от формы:
// выводим значение, полученное в первый раз
// и сохраненное в переменной $mytest:
print "<p>В первый раз вы ввели: " ;
print $mytest;
?>
</body>
</html>
Задание.
Модифицируйте сценарий action.php так, чтобы при введении в форму некоторого значения (например, 999) вызывалась бы функция завершения сессии session_destroy(). Проверьте, что после ее вызова произойдет со значением переменной $mytest.