П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 4104 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 6762 раз(а).

Учебник HTML.
Просмотров 3722 раз(а).

Руководство по PHP5.
Просмотров 5996 раз(а).

Хостинг через призму DNS.
Просмотров 4817 раз(а).

Подборка текстов стандартных документов.
Просмотров 56248 раз(а).

Учебник PHP - Самоучитель
Просмотров 3709 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 8358 раз(а).

Внешние атаки...
Просмотров 4571 раз(а).

Учебник PHP.
Просмотров 3177 раз(а).

SSI в примерах.
Просмотров 177 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





ГЛАВА 13. Cookie и отслеживание сеанса

Назначение пользовательских функций для хранения сеансовых данных

Хранить сеансовые данные в файлах удобно, но вполне возможно, вы захотите воспользоваться другими средствами — например, базами данных. А может быть, вы хотите применить один и тот же сценарий на разных сайтах для разных баз данных. Существует и другая распространенная проблема — стандартная для РНР процедура хранения сеансовых данных в файлах затрудняет совместное использование данных на разных серверах. К счастью, все эти проблемы отслеживания сеансов в РНР решаются очень просто, поскольку РНР дает пользователю возможность установить собственную процедуру сохранения при помощи стандартной функции 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 — в ней описаны назначение всех шести функций и их параметры.

Чтобы использовать функцию session_set_save_handler(), необходимо присвоить параметру session.save_handler в файле php.ini значение user.

Таблица 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($sess_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() по мере необходимости.

Назад | Содержание раздела | Общее Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru