52680.fb2 Справочник по PHP - читать онлайн бесплатно полную версию книги . Страница 103

Справочник по PHP - читать онлайн бесплатно полную версию книги . Страница 103

Если посетитель запускает программу впервые, у него устанавливается Cookies с уникальным идентификатором, и создается временное хранилище, ассоциированное с этим идентификатором. Определяется, какое хранилище связано с текущим идентификатором пользователя. Если в хранилище имеются какие-то переменные, их значения восстанавливаются. Точнее, создаются глобальные переменные, которые были сохранены в сессии при предыдущем завершении сценария.

Надо заметить, что если вы поставили в настройках PHP режим session.auto_start=1, то функция инициализации вызывается автоматически при запуске сценария. Так же надо следить за тем, чтобы до нашей функции не было никакого вывода в браузер - иначе PHP не сможет установить SID для пользователя.

Функция всегда возвращает true.

session_register

Указывает PHP на то, что ту или иную переменную нужно сохранить в сессии.

Синтаксис:

bool session_register(mixed name [, mixed name1, ...])

Функция принимает в параметрах одно или несколько имен переменных (имена задаются в скобках, без знака $ слева), регистрируют их в текущей запущенной сессии и возвращает true, если регистрация прошла успешно.

Повторная запись одной переменной в сессии не приведет к ошибке.

<?php

session_start();

session_register("count");

$count=@$count+1;

?>

<h2>Счетчик</h2>

В текущей сессии работы с браузером вы открыли эту страницу

<?=$count?> раз(а). Закройте браузер, чтобы обнулить счетчик.

</body>

Имя группы сессии

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

Для наглядности рассмотрим пример:

Пусть разработчик А написал сценарий счетчика. Он использует переменную $count, и не имеет никаких проблем. До тех пор, пока разработчик В, ничего не знающий о сценарии А, не создал систему статистики, которая тоже использует сессии. Самое ужасное, что он также регистрирует переменную $count, не зная о том, что она уже занята. В результате, как всегда, страдает пользователь: запустив сначало сценарий разработчика В, а потом - А, он видит, что данные счетчиков перемешались.

Нам нужно как-то разграничить сессии, принадлежащие одному сценарию, от сессии, принадлежащих другому. К счастью, разработчики PHP предусмотрели такое положение вещей. Мы можем давать группам сессии непересекающиеся имена, и сценарий, знающий имя своей группы сессии, сможет получить к ней доступ. Вот теперь-то разработчики А и В могут оградить свои сценарии от проблем с пересечением имен переменных. Достаточно в первой программе указать PHP, что мы хотим использовать группу с именем, например, sesA, а во второй - sesB.

session_name

Эта функция устанавливает или возвращает имя группы сессии, которая будет использоваться PHP для хранения зарегистрированных переменных.

Синтаксис:

string session_name([string $newname])

Если $newname не задан, то возвращается текущее имя. Если же этот параметр указан, то имя группы будет изменено на $newname, при этом функция вернет предыдущее имя.

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

Если функция session_name() не была вызвана по инициализации, PHP будет использовать имя по умолчанию - PHPSESID.

Пример:

<?php

session_name("CounterScript"

session_start();

session_register("count");

$count=@$count+1;

?>

В текущей сессии вы открыли эту страницу <?=$count?> раз(а).

Идентификатор сессии

Итак, идентификатор сессии является именем временного хранилища, которое будет использовано для хранения данных сессии между запусками сценария. Один SID - одно хранилище. Нет SID, нет и хранилища, и наоборот.

Так как же соотносится идентификатор и имя группы? Имя - это всего лишь собирательное название для нескольких сессий (то есть, для многих SID), запущенных разными пользователями. Один и тот же клиент никогда не будет иметь два различных SID в пределах одного имени группы. Но его браузер вполне может работать с несколькими SID, расположенными логически в разных "пространствах имен".

Итак, все SID уникальны и однозначно определяют сессию на компьютере, выполняющем сценарий - независимо от имени сессии. Имя же задает пространство имен, в которое будут сгруппированы сессии, запущенные разными пользователями. Один клиент может иметь сразу несколько активных пространств имен (то есть несколько имен групп сессий).

session_id

Эта функция возвращает текущий идентификатор сессии SID.

Синтаксис:

string session_id([string $sid])

Если задан параметр $sid, то у активной сессии изменяется идентификатор на $sid.

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

Другие функции

session_is_registered

Проверяет, зарегистрирована или нет та или иная переменная.

Синтаксис:

bool session_is_registered(string $name)