Здравствуйте, использую самописный форум. Функционал постоянно расширяется, но есть одно НО.... Нужен алгоритм благодаря которому на форуме выделялись бы темы в которых есть новые сообщения. Например, как на этом сайте: Новые сообщения Нет новых сообщений Если кому-то не сложно, опишите, пожалуйста как это работает.
самое простое - вешать пользователю куку (cookie), со значением последнего времени посещения сайта. в след. раз, когда юзер зайдет на сайт, он передаст эту куку серверу, а наше дело обработать ее соответстующим образом. то есть, когда генерим хтмл код страницы у нас есть время создания топика (в твоем движке же есть?) и время последнего посещения усера.
Неплохой вариант, вполне подходит. Правда бывает, что при закрытии браузера куки чистятся и тогда при новом заходе все посты будут новыми. Время есть - date('U'), так удобнее сравнивать. Конечно же можно использовать БД, но это, как мне кажется, довольно затратное занятие. Интересно, а какие еще есть варианты?
только больной на всю голову человек может сделать так, чтобы у него браузер чистил куки при закрытии - это ставит крест вообще на всей идее кук. с такими пользователями разговор короткий - нет кук, не увидишь, какие топики обновлены. можно конечно и бд использовать, но это, как ты сам заметил, абсолютно не целесообразно. если есть, что можно перенести на сторону пользователя, эту возможность нужно использовать.
bkm идеальный вариант - хранить в отдельной таблице юзер - топик - дата посещения и выгребать дату последнего посещения для пользователя, смотреть в каких форумах содержатся более новые изменения, и помечать их как непрочитанные. однако это грозит архи огромными таблицами. на этом форуме (да и на некоторых других) список посещений и дат предпочитают хранить в куках. таким образом разгружается база, но при заходе с другого компьютера непрочитанными будут помечены все топики, которые изменились с момента последнего захода пользователя, а не действительно непрочитанные. например, я зашёл на форум, ничего не прочитал, вышел. зашёл с другого компа/браузера - все топики, будут отмечены прочитанными, хотя я их не читал! однако они будут отмечены непрочитанными если изменились с момента моего последнего визита на форум. релизаций много, на каком-то форуме видел топик на несколько десятков страниц с возможными вариантами реализации непрочитанных сообщений - вплоть до хранения места последнего чтения
Возникла идея. При авторизации пользователя открывается сессия, в массиве лежит дата последнего посещения. При заходе на форум скрипт проверит, есть ли новые топики и посты простым условием больше/меньше. Если есть можно даже посчитать сколько и в каких топиках новых постов.
можно и в сессии, но этому способу присущи все недостатки бд-варианта. к тому же в бд-варианте уведомление о новых сообщениях/топиках будут видеть только авторизованные пользователи.
Действительно, есть огромный недостаток. Сообщения будут новые, пока юзер не переавторизировался. А если обновить сессию, то другие ещё непрочитанные посты в других топиках пометятся, как прочитанные.
Может как вариант, хранение на сервере файла для каждого пользователя где храниться идентификаторы разделов и дата их посещения пользователем (что бы быстро сформировать главную страницу не прерывая весь файл). Ну и идентификаторы тем и дата их просмотра. Фактически те же куки только без последствий от смены компа юзером. Ну и остальные данные о том что пользователь делал могут так же храниться в файле. Фактически гибридная система база + файлы.
Или еще как вариант, хранение этих данных в файле при авторизации пользователя создание временной таблицы в базе загрузка туда всех данных из файла и работа с этой таблицей по окончании сбрасывание с таблицы в фаил что то типа архива и удаление таблицы. Не пинать если сказл глупость
а у меня без кук и без доп. таблиц. Если юзер не открывал тему - она с любого пк будет непрочитанной. Вот и думайте
Апельсин, был на Вашем сайте, дизайн понравился, всё стильно и продумано. Конечно алгоритм не узнал, но главное знаю, что есть к чему стремиться и куда развиваться. Спасибо, что оставили надежду =)
Апельсин ну можешь хотя бы дать направление ? В любом случае надо где-то сохранить информацию о просмотре а это: 1. База 2. Файл 3. Куки Я когда только сделал первый запрос в базу в жизни написал для себя небольшую систему, если перефразировать ее на тему форума то просмотры я хранил так. В информации о теме была ячейка куда я просто записывал ID тех кто заглянул в эту тему без всякого времени и прочего (пример #1#45#234#), есть ID в поле значит смотрел, нету значит не смотрел, если в теме происходят изменение ячейка просто очищается а значит в ней больше нет ID со всем последствиями в плане того что пользователь не видел тему. Никаких проверок на тему дат и времени просто проверка на наличие ID в ячейке и все. Эта идея до безумия простая и имеет свои плюсы и минусы: + в том что база по сути постоянно регулируется, каждый раз при изменении в теме ячейка очищается короче данные не увеличиваются в геометрической прогрессии. - в обработке таких ячеек. Так же размер ячейки не бесконечен. Я не очень пока хорошо разбираюсь в работе баз данных и не знаю насколько эффективно работать с подобным типом хранения данных о просмотре. С тех пор мне стал интересен поиск более оптимального решения,.
У меня с помощью доп поля (TEXT) у юзера. В него записываются сериализованные пары дата:топик. Остальное уже сами додумывайте, особо сложного там нет. Кому то больше понравится вариант с доп. таблицами, но я не захотел так делать - лишние запросы в базу займут больше времени чем мой вариант. Куки тут вообще не должны фигурировать как вариант - это не тру. Мой способ позволяет отметить каждый топик прочитанным/непрочитанным, к тому же выделить родительскую ветку и обозначить, что в ней есть топы с новыми сообщениями. Но нет детализации по сообщениями - то есть видно что в топе есть новые сообщения, но какие именно - нет. Мне этого и не надо было. Для оптимизации этого доп. поля нужно дописать алгоритм удаления старых дат топиков. Плюс можно додумать фишку "Отметить все топы как прочитанные"
Ну собственно то самое что я написал выше тока я для каждого топика сохранял ID пользователей их смотревших в поле ТЕХТ. В случае если выбирать между хранить в ячейке пользователя все темы что он смотрел с датой и хранить в ячейке темы просто список ID пользователей её смотревших и просто очищать ее, то вариант хранить пользователей в ячейке темы лучше, меньше запросов меньше напряг, база в размерах растет гораздо тише. но есть ли еще более лучший идеологический вариант вот в чем вопрос
хуже этого придумать трудно. Это совсем не то что я описал. В моем подходе при 500-х темах вообще не должно быть заметных тормозов. у тебя если 500 чел просмотрит 1 тему - это уже будет кишка, которую постоянно нужно запрашивать с базы для просмотра каждому юзеру. В моем же варианте - у всех 500 чел будет только одна запись про просмотренный топ, что не вызовет нагрузки. Когда свыше 500 тем на форуме уже - должен работать алгоритм очистки старых тем.
Ок взглянем иначе. Ты проверяешь были ли изменений в теме. Берешь из поля юзера ИД темы и время когда юзер разбираешь из кодом что бы отделить ИД от времени и составить запрос в базу, потом просишь базу проверить че там с вопросом времени изменений. А теперь у тебя 100 тем и тебе поочередно надо взять каждую тему из данных пользователя и сверить ее с датами обновления тем на форуме можно и иначе но от перестановки ест слагаемых сумма не измениться. В моем варианте просто один короткий запрос на наличие строчки определенего формата в ячейках и получение список ИД тем в ответ. Твоя ячейка у пользователя превращается в кишку не меньше, а если говорить об алгоритме очистки старых тем то то же самое применимо и к технологии хранения ИД в инфе о теме. И того ты проходишь по 100 темам и записываешь в 1 ячейку 100 записей достаточно длинных ИД темы и дата. Я прохожу по 100 темам и записываю в 100 ячеек по одной записи которая еще и короче в несколько раз. И дает мне быстро если это надо информацию о том какие пользователи уже видели изменения если это мне надо, тебе что бы получить эти данные придеться прогуляться по всем пользователям задавая вопросы каждому а был ли ты там не позже такого то времени. Посему пока что неубедительны твои слова на тему хуже этого быть не может.
одни двойки... я уже обьяснил, что никаких подзапросов я не делаю. до мелочей и готового кода разжевывать я не собираюсь.
Готовый код мне не интересен, мне интересна общая идеология и именно о ней и речь а не о деталях реализации. И в идеологии своей твой и мой вариант фактически одно и то же с оговоркой что каждый более лучше подойдет для одной задачи и хуже для другой, ну и вопрос детальной реализации играет не последнею роль. Суть обоих вариантов что данные о просмотре пишутся в одну ячейку а уж пользователя или темы это уже кому как по вкусу. Есть еще у кого какие идее кроме описанных выше ?
Это назвается денормализация базы. На одном джойне сэкономил, да. Зато теперь гоняешь огромный текстовый блок даже когда это совсем не нужно (просмотр темы). Плюс так себе логика на отсеивание старых и удаленных тем будет, тогда как можно было обойтись одним красивым запросом. ЗЫ: а куки используются для того, что бы такой же функционал работал и не для зарегистрированных
я никому не навязывал своего решения. "бутылочным горлышком" в большинстве случаев является ожидание ответа от бд и поиск по ней, а не обработка данных через пхп. делайте "красивый джоин", кто ж запрещает.