Назначение пользовательских функций для хранения сеансовых данных
Хранить
сеансовые данные в файлах удобно, но вполне
возможно, вы захотите воспользоваться
другими средствами — например, базами
данных. А может быть, вы хотите применить
один и тот же сценарий на разных сайтах для
разных баз данных. Существует и другая
распространенная проблема — стандартная
для РНР процедура хранения сеансовых
данных в файлах затрудняет совместное
использование данных на разных серверах. К
счастью, все эти проблемы отслеживания
сеансов в РНР решаются очень просто,
поскольку РНР дает пользователю
возможность установить собственную
процедуру сохранения при помощи
стандартной функции session_set_save_handler( ).
Функция session_set_save_handler( ) определяет процедуры сохранения и загрузки сеансовых данных пользовательского уровня.
Синтаксис функции session_set_save_handler():
void session_set_save_handler (string open, string close, string read, string write, string destroy, string go)
Шесть параметров session_set_save_handler( ) соответствуют шести функциям, вызываемым сеансовыми функциями РНР. Хотя имена этих функций могут быть произвольными, каждая функция должна получать жестко заданный набор параметров. Перед тем как переходить к рассмотрению примера, просмотрите таблицу 13.2 — в ней описаны назначение всех шести функций и их параметры.
Таблица
13.2. Шесть
параметров функции session_set_save_handler( )
Параметр
Описание
sess_close(
)
Вызывается
при завершении сценария, в котором
реализуются сеансовые функции. Не
путайте эту функцию с
функцией sess_destroy( ), предназначенной для
уничтожения сеансовых переменных. Функция
sess_close( ) вызывается без параметров
sess_destroy($идент_ceaнca)
Удаляет все
сеансовые данные. Параметр определяет
удаляемый сеанс
sess_gc($срок_действия)
Удаляет все сеансы с
завершенным сроком действия. Срок
определяется параметром $срок_действия,
значение которого задается в секундах.
Параметр читается из файла php.ini и
соответствует значению session.gcjifetime
sess_open($путь, $имя)
Вызывается при инициализации нового сеанса
функцией session_start( ) или session_register( ). Два
параметра читаются из файла php.ini и
соответствуют значениям session.save_path и session.name
sess_read($ключ)
Используется
для выборки значения сеансовой переменной,
определяемой заданным ключом
sess_write($ключ, $значение)
Используется
для сохранения сеансовых данных. Любые
данные, сохраненные функцией sess_write( ),
позднее могут быть прочитаны функцией sess_read(
).
Параметр $ключ соответствует имени
сеансовой переменной, а параметр $значение
— значению, связываемому с заданным ключом
Теперь, когда вы знаете все, что необходимо знать о параметрах session_set_save_handler( ), мы рассмотрим пример реализации сеансовых функций на базе MySQL (листинг 13.8).
Листинг 13.8. Реализация сеансовых функций на базе MySQL
<?
// Реализация сеансовых функций на базе MySQL
// Хост, имя пользвателя и пароль
$host = "localhost"; $user = "web"; $pswd = "4tf9zzzf";
// Имена таблицы и базы данных
$db = "users";
$session table = "user session data";
// Прочитать значение sess.gc_lifetime из файла php.ini
$sess_life = get_cfg_var("sess.gc_lifetime");
// Функция : mysql_sess_open()
// Назначение: подключение к серверу MySQL
// и выбор базы данных.
function mysql_sess_open($save_path. $session_name) {
GLOBAL $host. $user, $pswd, $db;
@mysql_connect($host, $user, $pswd)
or die("Can't connect to MySQL server!");
@mysql_select_db($db)
or die("Can't select session database!");
}
// Функция: mysql_sess_close()
// Назначение: в реализации на базе MySQL эта функция не используется.
// Тем не менее, она Обязательно* должна быть определена.
function diysql_sess_close() {
return true:
}
// Функция: mysql_sess_read()
// Назначение: загрузка информации из базы данных MySQL.
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;
endlf;
return false;
}
// Функция: mysql_sess_write( )
// Назначение: запись информации в базу данных MySQL.
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);
// Если запрос на вставку данных завершился неудачей // из-за присутствия первичного ключа в поле sess_key, // выполнить обновление.
if (! $result) :
$query = "UPDATE $session_table
SET sess_expiration = '$expiration', sess_value='Svalue'
WHERE sess_key = '$key'"; $result = mysql_query($result);
endif;
}
// Функция: mysql_sess_destroy()
// Назначение: удаление из таблицы всех записей с ключом, равным $sess_id
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;
}
// Функция: mysql_sess_gc()
// Назначение: удаление всех записей, у которых
// срок жизни < текущее время - session.gc_lifetime
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( )).
Такой подход удобен тем, что вы можете
создать сколько угодно реализаций и
переключаться между ними, вызывая
ses-sion_set_save_handler( ) по мере необходимости.