Решил я заюзать стандартную функцию session_set_save_handler для реализации собственного хранения сессий, решил хранить сессии в бд. Написал класс для оброботки сессий, так же у меня есть класс для работы с бд.
Проблема заключается в следующем в методе write класса сессий напрочь не видит класс бд. Обращение к методу write в классе сессий происходит из функции session_set_save_handler. Он думаем что класс бд не инициализирован. Подскажите как сделать чтобы метод класса сессий все таки его увидел класс бд. Класс бд инициализируется первым.
Вот вырезки из кода
Файлик index.php
require_once 'include/config.php';
require_once 'include/class/class.db.php';
require_once 'include/session.php';
$db = new db($db_host, $db_user, $db_pass, $db_db, ""); // db($host, $username, $password, $name,$prefix,$p_connect=false,$debug=false)
$handler = new SessionHandler();
session_set_save_handler( array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gb'));
//Инициируем сессию
session_start();
//---------------------- Тест работы сессии: ---------------------------------
echo '<h1>'.session_id().'</h1>';
// Создадим некий инкремент, если он не существовал,
// И увеличим его на 1, если он существует:
if( isset($_SESSION['increment']) )
{
$_SESSION['increment']++;
}
else
{
$_SESSION['increment'] = 1;
}
echo '<h1> increment = '.$_SESSION['increment'].'</h1>';
Файлик session.php
<?php
class SessionHandler
{
// Эти функции оставим пустыми...
function open($sess_path, $sess_name)
{
return true;
}
function close()
{
return true;
}
// Читаем данные
function read($sess_id)
{
global $db;
$sql = "SELECT `sess_data` FROM `sessions` WHERE `session_id`='".$sess_id."';";
$query = $db->query($sql);
$num = $db->num_rows($query);
$current_time = time();
// Если данные получены, нам нужно обновить дату
// доступа к данным:
if($num > 0)
{
$row = $db->fetch_assoc($query);
$sql = "UPDATE `sessions` SET date_touched='".$current_time."' WHERE session_id='".$sess_id."';";
$db->query($sql);
// Как мы помним только из этого обработчика
// Мы возвращаем данные, а не логическое значение:
return html_entity_decode($row['sess_data']);
}
else
{
$sql = "INSERT INTO `sessions` SET session_id='".$sess_id."', date_touched='".$current_time."';";
$db->query($sql);
return '';
}
}
// Пишем данные:
function write($sess_id, $data)
{
global $db;
$current_time = time();
$sql = "UPDATE `sessions` SET `date_touched`='".$current_time."', `sess_data`='".htmlentities($data,ENT_QUOTES)."' WHERE `session_id`= '".$sess_id."';";
$db->query($sql);
return true;
}
// Уничтожаем данные:
function destroy($sess_id)
{
global $db;
$sql = "DELETE FROM `sessions` WHERE `session_id`='".$sess_id."';";
$db->query($sql);
return true;
}
// Описываем действия сборщика мусора:
function gb($sess_maxlifetime)
{
global $db;
$current_time = time();
$sql = "DELETE FROM `sessions` WHERE date_touched + '".$sess_maxlifetime."' < '".$current_time."';";
$db->query($sql);
return true;
}
}
?>