|
|
|
| Здравствуйте! Такая проблема возникла у меня. Реализовал собственный механизм сессий: с помощью функции session_set_save_handler() назначил список пользовательских функций,которые открывают,закрывают,читают,записывают,удаляют информацию в базу данных MySQL. Установил директиве session.save_handler значение "user". Всё работает нормально за исключением функции сборки мусора,которая прописана шестым аргументом в session_set_save_handler() | |
|
|
|
|
|
|
|
для: Syava
(18.04.2008 в 17:19)
| | Нескоромный вопрос к одному из тех, кто решил изменить стандартный механизм сессий: какой смысл? | |
|
|
|
|
|
|
|
для: Atheist
(18.04.2008 в 17:23)
| | >Нескоромный вопрос к одному из тех, кто решил изменить стандартный механизм сессий: какой смысл?
Мне с БД работать удобнее, мне необходим учёт текущих сессий и я на основе записей в БД буду ориентироватся.. Тем более что запросы к MySQL значительно быстрее обрабатываются, чем работа с файл.системой | |
|
|
|
|
|
|
|
для: 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: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
(18.04.2008 в 17:26)
| | Вызвал функцию в open. Теперь работает:)
А что, разве собственный механизм сессий на базе данных будет обрабатыватся дольше, чем стандартный на файлах? | |
|
|
|
|
автор: Qwert (19.04.2008 в 02:22) |
|
|
для: Syava
(19.04.2008 в 01:59)
| | БД использует ту же файловую систему. По твоему данные там хранятся как-то иначе? Другое дело что работать с ними намного удобнее. Насчет быстродействия такого механизма сессий, то он будет в разы медленнее, чем обычный, зато функциональней. Чем-то жертвовать придется... | |
|
|
|
|
|
|
|
для: Qwert
(19.04.2008 в 02:22)
| | Я имел ввиду что запросы к MySQL обрабатываются быстрее чем действия с файлами.. По крайней мере так есть когда записываешь и извлекаешь какую-то информацию, насчёт операций с сессиями утверждать не буду, так как не имею представления как происходит запись и извлечение стандартных php-сессий.. | |
|
|
|
|
|
|
|
для: Syava
(19.04.2008 в 10:59)
| | когда записываешь и извлекаешь какую-то информацию
когда просто записываешь и извлекаешь потоком, то файлы работают быстрее.. ещё быстрее работают "плоские файлы", а база данных (а точнее СУБД) сильна именно в обработке информации, для этого и существуют такие замудрёные SQL-запросы. Во всех книгах написано, что не надо делать средствами РНР то, что можно сделать СУБД иначе все приемущества БД кошке под хвост. | |
|
|
|
|
|
|
|
для: Syava
(19.04.2008 в 10:59)
| | Нет, в скорости ты выиграешь при выборке и сортировке определенных данных. Но в данном случае ты тупо сливаешь с базы одну строку и записываешь. В данном случае быстрее будут файлы, не говоря уже о том, что стандартный механизм написан на C. | |
|
|
|
|
|
|
|
для: Atheist
(19.04.2008 в 16:43)
| | Ну допустим.. Но а как ещё я смогу узнать сколько в данный момент задействовано сессий, какие SID-ы и кому принадлежат, не прибегая к подобной записи сессий? Мне всё это необходимо в скрипте и поэтому я решил таким способом вести учёт сессий.. Если есть другие,более рациональные варианты,о которых я не знаю-расскажите.. Я php изучаю сравнительно недавно, а с сессиями так вобще раньше работать не доводилось.. | |
|
|
|
|
|
|
|
для: Syava
(19.04.2008 в 18:34)
| | > не прибегая к подобной записи сессий
А почему нужна именно подобная запись? Что мешает совместить запись SID в таблицу и стандартный механизм? | |
|
|
|
|
|
|
|
для: Atheist
(19.04.2008 в 18:40)
| | Так я не вижу смысла в стандартном механизме.. Ведь, если буду записывать сессии в БД тогда для чего их же записывать ещё и в файл? Получится двойная запись одного и того же.. Или я не прав? | |
|
|
|
|
|
|
|
для: Syava
(19.04.2008 в 18:51)
| | SID будешь записывать. При чем тут данные сессии? | |
|
|
|
|
|
|
|
для: Atheist
(19.04.2008 в 18:51)
| | А.. Только SID.. Надо будет подумать над этим, возможно переделаю скрипт именно так.. Ну теперь у меня возникает другой вопрос: если создание собственного механизма сессий столь "не выгодно", то для чего его привели в книге? Ведь где-то же используют наверно свои механизмы.. | |
|
|
|
|
|
|
|
для: Syava
(19.04.2008 в 19:01)
| | В какой книге?
Что касается PHP, то его старались делать так, чтобы удовлетворить как можно больше программистов. Из-за этого много лишнего...В PHP 6 уберают "хлам" вроде register_globals, magic_quotes_gpc, POSIX regexp, ....
Но что касается своего механизма сессий - ну кому-то может и действительно нужно делать какие-то манипуляции во время чтения данных, записи или при закрытии сессии. Придумывать не люблю. | |
|
|
|
|
|
|
|
для: Atheist
(19.04.2008 в 19:10)
| | Книга "PHP для хакера" или как-то типа такого.. Я сам книгу не читал, просто тут на форуме в архивных темах нарыл об этом.. | |
|
|
|
|
|
|
|
для: Syava
(19.04.2008 в 19:01)
| | Перегрузка механизма сессий выгодна в том случае, если вы хотите иметь актуальный список всех пользователей и производить оптовые изменения в массиве $_SESSION. Если вам нужна скорость, то этот механизм лучше не перегружать. | |
|
|
|
|
|
|
|
для: cheops
(20.04.2008 в 10:59)
| | Всё понятно! Спасибо | |
|
|
|