Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Собственный механизм сессий и проблема со "сборкой мусора"
 
 автор: Syava   (18.04.2008 в 17:19)   письмо автору
 
 

Здравствуйте! Такая проблема возникла у меня. Реализовал собственный механизм сессий: с помощью функции session_set_save_handler() назначил список пользовательских функций,которые открывают,закрывают,читают,записывают,удаляют информацию в базу данных MySQL. Установил директиве session.save_handler значение "user". Всё работает нормально за исключением функции сборки мусора,которая прописана шестым аргументом в session_set_save_handler()

   
 
 автор: Atheist   (18.04.2008 в 17:23)   письмо автору
 
   для: Syava   (18.04.2008 в 17:19)
 

Нескоромный вопрос к одному из тех, кто решил изменить стандартный механизм сессий: какой смысл?

   
 
 автор: Syava   (18.04.2008 в 17:29)   письмо автору
 
   для: Atheist   (18.04.2008 в 17:23)
 

>Нескоромный вопрос к одному из тех, кто решил изменить стандартный механизм сессий: какой смысл?
Мне с БД работать удобнее, мне необходим учёт текущих сессий и я на основе записей в БД буду ориентироватся.. Тем более что запросы к MySQL значительно быстрее обрабатываются, чем работа с файл.системой

   
 
 автор: Atheist   (18.04.2008 в 17:50)   письмо автору
 
   для: Syava   (18.04.2008 в 17:29)
 

При переписывании механизма сессий на PHP я бы не стал говорить так уверенно о скорости.

Что интересно, то callback-функция gc и у меня не вызывалась нигде при тесте. Вызываются при старте open, read. write и close в конце.

> open('/tmp', 'PHPSESSID')
> read('05d2a464caa46068496fc2a1276fee1d')
> write('05d2a464caa46068496fc2a1276fee1d', '')
> close()


Можно вызывать gc() в close().

   
 
 автор: Syava   (18.04.2008 в 17:26)   письмо автору
 
   для: Syava   (18.04.2008 в 17:19)
 

function gc($maxtime)
{
$q = "DELETE FROM `session` WHERE `time` < UNIX_TIMESTAMP() - 1440";
if(!mysql_query($q)) exit(mysql_error());
return true;
}
//вот эта функция должна удалять все сессии, время последнего обновления которых было более чем 24 минуты назад.. Поле `time` имеет тип int (11) и туда записывается текущий UNIX_TIMESTAMP() при каждом обращении к сессии.. Смотрел по базе -всё записывается без проблем, только вот удаления согласно этому условию не происходит.. В чём может быть проблема? Спасибо.

   
 
 автор: Syava   (19.04.2008 в 01:59)   письмо автору
 
   для: Syava   (18.04.2008 в 17:26)
 

Вызвал функцию в open. Теперь работает:)
А что, разве собственный механизм сессий на базе данных будет обрабатыватся дольше, чем стандартный на файлах?

   
 
 автор: Qwert   (19.04.2008 в 02:22)
 
   для: Syava   (19.04.2008 в 01:59)
 

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

   
 
 автор: Syava   (19.04.2008 в 10:59)   письмо автору
 
   для: Qwert   (19.04.2008 в 02:22)
 

Я имел ввиду что запросы к MySQL обрабатываются быстрее чем действия с файлами.. По крайней мере так есть когда записываешь и извлекаешь какую-то информацию, насчёт операций с сессиями утверждать не буду, так как не имею представления как происходит запись и извлечение стандартных php-сессий..

   
 
 автор: Valick   (19.04.2008 в 11:18)   письмо автору
 
   для: Syava   (19.04.2008 в 10:59)
 

когда записываешь и извлекаешь какую-то информацию
когда просто записываешь и извлекаешь потоком, то файлы работают быстрее.. ещё быстрее работают "плоские файлы", а база данных (а точнее СУБД) сильна именно в обработке информации, для этого и существуют такие замудрёные SQL-запросы. Во всех книгах написано, что не надо делать средствами РНР то, что можно сделать СУБД иначе все приемущества БД кошке под хвост.

   
 
 автор: Atheist   (19.04.2008 в 16:43)   письмо автору
 
   для: Syava   (19.04.2008 в 10:59)
 

Нет, в скорости ты выиграешь при выборке и сортировке определенных данных. Но в данном случае ты тупо сливаешь с базы одну строку и записываешь. В данном случае быстрее будут файлы, не говоря уже о том, что стандартный механизм написан на C.

   
 
 автор: Syava   (19.04.2008 в 18:34)   письмо автору
 
   для: Atheist   (19.04.2008 в 16:43)
 

Ну допустим.. Но а как ещё я смогу узнать сколько в данный момент задействовано сессий, какие SID-ы и кому принадлежат, не прибегая к подобной записи сессий? Мне всё это необходимо в скрипте и поэтому я решил таким способом вести учёт сессий.. Если есть другие,более рациональные варианты,о которых я не знаю-расскажите.. Я php изучаю сравнительно недавно, а с сессиями так вобще раньше работать не доводилось..

   
 
 автор: Atheist   (19.04.2008 в 18:40)   письмо автору
 
   для: Syava   (19.04.2008 в 18:34)
 

> не прибегая к подобной записи сессий
А почему нужна именно подобная запись? Что мешает совместить запись SID в таблицу и стандартный механизм?

   
 
 автор: Syava   (19.04.2008 в 18:51)   письмо автору
 
   для: Atheist   (19.04.2008 в 18:40)
 

Так я не вижу смысла в стандартном механизме.. Ведь, если буду записывать сессии в БД тогда для чего их же записывать ещё и в файл? Получится двойная запись одного и того же.. Или я не прав?

   
 
 автор: Atheist   (19.04.2008 в 18:51)   письмо автору
 
   для: Syava   (19.04.2008 в 18:51)
 

SID будешь записывать. При чем тут данные сессии?

   
 
 автор: Syava   (19.04.2008 в 19:01)   письмо автору
 
   для: Atheist   (19.04.2008 в 18:51)
 

А.. Только SID.. Надо будет подумать над этим, возможно переделаю скрипт именно так.. Ну теперь у меня возникает другой вопрос: если создание собственного механизма сессий столь "не выгодно", то для чего его привели в книге? Ведь где-то же используют наверно свои механизмы..

   
 
 автор: Atheist   (19.04.2008 в 19:10)   письмо автору
 
   для: Syava   (19.04.2008 в 19:01)
 

В какой книге?
Что касается PHP, то его старались делать так, чтобы удовлетворить как можно больше программистов. Из-за этого много лишнего...В PHP 6 уберают "хлам" вроде register_globals, magic_quotes_gpc, POSIX regexp, ....
Но что касается своего механизма сессий - ну кому-то может и действительно нужно делать какие-то манипуляции во время чтения данных, записи или при закрытии сессии. Придумывать не люблю.

   
 
 автор: Syava   (19.04.2008 в 19:21)   письмо автору
 
   для: Atheist   (19.04.2008 в 19:10)
 

Книга "PHP для хакера" или как-то типа такого.. Я сам книгу не читал, просто тут на форуме в архивных темах нарыл об этом..

   
 
 автор: cheops   (20.04.2008 в 10:59)   письмо автору
 
   для: Syava   (19.04.2008 в 19:01)
 

Перегрузка механизма сессий выгодна в том случае, если вы хотите иметь актуальный список всех пользователей и производить оптовые изменения в массиве $_SESSION. Если вам нужна скорость, то этот механизм лучше не перегружать.

   
 
 автор: Syava   (20.04.2008 в 14:29)   письмо автору
 
   для: cheops   (20.04.2008 в 10:59)
 

Всё понятно! Спасибо

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования