Обдумывая вопрос о сессии, я окончательно отказался от сессии:
1. Исходный сеанс управляется с помощью файлов. Качество файловой системы напрямую влияет на производительность сессии, особенно когда в сети одновременно находится несколько K человек. Есть два решения: база данных и файл (с использованием хеш-пути).
2. Исходная сессия имеет плохую масштабируемость и управляемость. Не способствует интеграции с существующей системой.
3. При выборе базы данных я не выбрал sqlite. Последний раз, когда я проверял работоспособность sqlite на win xp, она оказалась не такой хорошей, как ожидалось.
Наконец, я выбрал таблицу кучи myql для обработки сеансов и объединил обработку сеансов с онлайн-статистикой пользователей.
Код, приведенный ниже, является моим примером (никаких других подробностей не предоставлено, конкретное использование должно быть соответствующим образом изменено).
<?
/**
* Обрабатывать онлайн-пользователей и моделировать сеансы.
* СОЗДАТЬ ТАБЛИЦУ `webqq_session` (
`sid` char(32) NOT NULL,
`uid` mediumint(8) NOT NULL,
`username` char( 80 ) NOT NULL ,
`ismember` tinyint(1) NOT NULL,
`logintime` int(10) NOT NULL,
`activetime` int( 10 ) NOT NULL ,
ПЕРВИЧНЫЙ КЛЮЧ («sid»)
) ENGINE = HEAP CHARSET DEFAULT = gb2312
* @author:feifengxlq< http://www.phpobject.net > feifengxlq#gmail.com
* @since:23 октября 2006 г.
* @copyright:http://www.phpobject.net
* Примечание. Использование этого файла необходимо сочетать с другими файлами: такими как фильтрация файлов cookie, некоторые базовые функции и классы операций с базой данных.
*/
классная сессия
{
вар $mysql;
вар $cookie_id='webqq_sid';
вар $session=массив();
var $max_time=1200;//Максимальное время по умолчанию — 20 минут
function__construct()
{
$this->mysql=new модуль(TB_PREX.'_session');//Требуется внешняя поддержка
$this->start();
}
функция старт()
{
если (пусто ($_COOKIE[$this->cookie_id]))
{
//Инициализируем сессию
$this->create();
}еще{
//Cookie уже существует, проверяем, существует ли он в базе данных
$sid=$_COOKIE[$this->cookie_id];
if($this->mysql->detail('where sid=''.$sid.'''))
{
//Существуем в базе данных
$row['activetime']=время();
$this->mysql->update($row,'where sid=''.$sid.''');
$this->session=$this->mysql->detail('where sid=''.$sid.''');
}еще{
//Не существует в базе данных
$this->create();
}
}
//Удаляем пользователей, которых нет в базе данных
$this->mysql->delete('where activetime+'.$this->max_time.'<'.time());
}
регистр функции ($имя,$значение,$обновление=false)
{
if(array_key_exists($name,$this->session)){
$this->session[$name]=$value;
}
если ($ обновление) $ это-> обновление ();
}
реестр функций($name='')
{
if(empty($name)) return $this->session;
if(array_key_exists($name,$this->session)){
вернуть $this->session[$name];
}
}
//Обновляем информацию о сеансе в базе данных
обновление функции()
{
$row['uid']=$this->session['uid'];
$row['username']=$this->session['username'];
$row['ismember']=$this->session['ismember'];
$row['logintime']=$this->session['logintime'];
$row['activetime']=$this->session['activetime'];
$this->mysql->update($row,'where sid=''.$this->session['sid'].''');
}
/*------------------Ниже приведены частные методы------------------------- --------------------------------**/
функциясоздать()
{
$nowtime=время();
$sid=md5('0'.$nowtime.getip());//Функция getip() должна быть предопределена: получить IP-адрес клиента
setcookie($this->cookie_id,$sid,$nowtime+3600*24);//по умолчанию 24 часа
$row['sid']=$sid;
$row['uid']=0;
$row['username']='гость';
$row['ismember']=0;
$row['logintime']=$nowtime;
$row['activetime']=$nowtime;
$this->mysql->add($row);//Запись в базу данных
$this->session=$row;
}
}
?>