KnigaRead.com/

White cat - Справочник по PHP

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн white cat, "Справочник по PHP" бесплатно, без регистрации.
Перейти на страницу:

Так как же соотносится идентификатор и имя группы? Имя - это всего лишь собирательное название для нескольких сессий (то есть, для многих 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)

Функция возвращает true, если переменная с именем $name была зарегистрирована в сессии, иначе возвращает false.


session_unregister


Отменяет регистрацию переменной.

Синтаксис:

bool session_unregister(string $name)

Эта функция отменяет регистрацию для переменной с именем $name для текущей сессии. Или иначе, при завершении сценария все будет выглядеть так, словно переменная с именем $name и небыла никогда зарегистрирована.

Возвращает true, если все прошло успешно, и false - в противном случае.

Отметим, что после вызова функции session_unregister() глобальная переменная, которая была "аннулирована", не уничтожается, а сохраняет свое значение.


session_unset


Отменяет регистрацию и уничтожает глобальные переменные.

Синтаксис:

void session_unset()

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


session_save_path


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

Синтаксис:

string session_save_path([string $path])

Эта функция возвращает имя каталога, в котором будут помещаться файлы - временные хранилища данных сессии. В случае, если указан параметр, активное имя каталога будет переустановлено на $path. При этом функция вернет предыдущий каталог.

Обзор обработчиков


handler_open


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

Синтаксис:

bool handler_open(string $save_path, string $session_name)

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


handler_close


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

Синтаксис:

bool handler_close()


handler_read


Чтение данных сессии.

Синтаксис:

string handler_read(string $sid)

Этот обработчик вызывают, когда нужно прочитать данные сессии с идентификатором $sid из временного хранилища.

Возвращаемые данные представлены в следующем виде:

имя1=значение1;имя2=значение2;имя3=значение3;...

имяN задает имя очередной переменной, зарегистрированной в сессии, а занчениеN - результат вызова функции Serialize() для значения этой переменной.

Например, наша запись может иметь следующий вид:

foo|i:1;count|i:10;

Она говорит о том, что из временного хранилища были прочитаны две целые переменные, первая из которых равна 1, а вторая - 10.


handler_write


Запись данных сессии.

Синтаксис :string handler_write(string $sid, string $data)

Этот обработчик предназначен для записи данных сессии с идентификатором $sid во временное хранилище - например, открытое ранее обработчиком handler_open(). Параметр $data задается в точно таком же формате. Фактически, чаще всего действие этой функции сводится к записи в базу данных строки $data без каких-либо ее изменений.


handler_gc


Очищает временное хранилище данных через определенный промежуток времени.

Синтаксис:

bool handler_gc(int $maxlifetime)

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


session_set_save_handler


Регистрация обработчиков.

При описании обработчиков мы указывали их имена с префиксом handler. На самом деле, это совсем не является обязательным. Даже наоборот - вы можете давать такие имена своим обработчикам, какие только захотите.

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

Синтаксис:

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

Эта функция регистрирует подпрограммы, имена которых переданы в ее параметрах, как обработчики текущих сессии. Параметр $open содержит имя функции, которая будет вызвана при инициализации сессии, а $close - функции, вызываемой при ее закрытии. В $read и $write нужно указать имена обработчиков, соответственно, для чтения и записи во временное хранилище. Функция с именем, заданным в $destroy, будет вызвана при уничтожении сессии. Наконец, обработчик, определяемый параметром $gc, используется как обработчик мусора.

Эту функцию можно вызывать только до инициализации сессии, в противном случае она просто игнорируется.

Про сессии и Cookies

Проблема: - отключены Cookies

Бытует распространенное мнение, что сессии без Cookies не может существовать. Действительно, Cookies наиболее просто решает проблему идентификации пользователя, что необходимо для связи временного хранилища и данных сессии. Но вот что делать, если пользователь у себя в настройках отключил прием Cookies?

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

Решение: - изменение гиперссылок и форм

В PHP существует одна специальная константа с именем SID. Она всегда содержит имя группы сессии и ее идентификатор в формате имя=идентификатор. Именно в таком формате данные принимаются, когда они приходят из Cookies браузера. Таким образом, нам достаточно просто передать значение константы SID в сценарий, чтобы он "подумал", будто бы данные пришли из Cookies.Вот пример использования сессий без Cookies:

<?php

session_name("testses");

session_start();

session_register("i");

[email protected]$i+1;

?>

<body>

Вы открыли эту страницу

<?=$i?> раз. При закрытии браузера счетчик обнулиться.<BR>

<A href=sesclick.php?<?=SID?>>Нажмите для записи в счетчик!</A>

</body>

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

Но в приведенном способе есть одно неудобство, а именно, везде в участки кода нужно вставлять <?=SID?>, и если вы гдето пропустили, то программа может не работать!

К счастью, разработчики PHP учли эту возможность, и решили уберечь нас от этого. По-этому если в какой-нибудь гиперссылке вы по ошибке пропустите <?=SID?>, PHP вставит его автоматически. При этом не повредив остальные параметры, которые могут присутствовать в URL.

Для проверки можно использовать следующий пример:

<?session_start()?>

<body>

<A href="php.php">PHP</A>

<A href="php.php?ss=1">PHP - выражения</A>

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*