За последние 24 часа нас посетили 124562 программиста и 2948 роботов. Сейчас ищут 1643 программиста ...

Новые сообщения на форуме, как?

Тема в разделе "PHP для новичков", создана пользователем bkm, 24 фев 2011.

  1. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Здравствуйте, использую самописный форум. Функционал постоянно расширяется, но есть одно НО....
    Нужен алгоритм благодаря которому на форуме выделялись бы темы в которых есть новые сообщения.

    Например, как на этом сайте:

    Новые сообщения [​IMG]
    Нет новых сообщений [​IMG]

    Если кому-то не сложно, опишите, пожалуйста как это работает.
     
  2. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    самое простое - вешать пользователю куку (cookie), со значением последнего времени посещения сайта. в след. раз, когда юзер зайдет на сайт, он передаст эту куку серверу, а наше дело обработать ее соответстующим образом. то есть, когда генерим хтмл код страницы у нас есть время создания топика (в твоем движке же есть?) и время последнего посещения усера.
     
  3. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Неплохой вариант, вполне подходит. Правда бывает, что при закрытии браузера куки чистятся и тогда при новом заходе все посты будут новыми. Время есть - date('U'), так удобнее сравнивать.
    Конечно же можно использовать БД, но это, как мне кажется, довольно затратное занятие.
    Интересно, а какие еще есть варианты?
     
  4. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    только больной на всю голову человек может сделать так, чтобы у него браузер чистил куки при закрытии - это ставит крест вообще на всей идее кук. с такими пользователями разговор короткий - нет кук, не увидишь, какие топики обновлены.
    можно конечно и бд использовать, но это, как ты сам заметил, абсолютно не целесообразно. если есть, что можно перенести на сторону пользователя, эту возможность нужно использовать.
     
  5. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    bkm
    идеальный вариант - хранить в отдельной таблице юзер - топик - дата посещения
    и выгребать дату последнего посещения для пользователя, смотреть в каких форумах содержатся более новые изменения, и помечать их как непрочитанные.

    однако это грозит архи огромными таблицами.

    на этом форуме (да и на некоторых других) список посещений и дат предпочитают хранить в куках.
    таким образом разгружается база, но при заходе с другого компьютера непрочитанными будут помечены
    все топики, которые изменились с момента последнего захода пользователя, а не действительно непрочитанные.

    например, я зашёл на форум, ничего не прочитал, вышел.
    зашёл с другого компа/браузера - все топики, будут отмечены прочитанными, хотя я их не читал!
    однако они будут отмечены непрочитанными если изменились с момента моего последнего визита на форум.

    релизаций много, на каком-то форуме видел топик на несколько десятков страниц с возможными вариантами
    реализации непрочитанных сообщений - вплоть до хранения места последнего чтения :)
     
  6. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Возникла идея. При авторизации пользователя открывается сессия, в массиве лежит дата последнего посещения. При заходе на форум скрипт проверит, есть ли новые топики и посты простым условием больше/меньше. Если есть можно даже посчитать сколько и в каких топиках новых постов.
     
  7. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    можно и в сессии, но этому способу присущи все недостатки бд-варианта.
    к тому же в бд-варианте уведомление о новых сообщениях/топиках будут видеть только авторизованные пользователи.
     
  8. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Действительно, есть огромный недостаток. Сообщения будут новые, пока юзер не переавторизировался. А если обновить сессию, то другие ещё непрочитанные посты в других топиках пометятся, как прочитанные.
     
  9. NR55RU

    NR55RU Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Может как вариант, хранение на сервере файла для каждого пользователя где храниться идентификаторы разделов и дата их посещения пользователем (что бы быстро сформировать главную страницу не прерывая весь файл).
    Ну и идентификаторы тем и дата их просмотра. Фактически те же куки только без последствий от смены компа юзером.
    Ну и остальные данные о том что пользователь делал могут так же храниться в файле.
    Фактически гибридная система база + файлы.
     
  10. NR55RU

    NR55RU Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Или еще как вариант, хранение этих данных в файле при авторизации пользователя создание временной таблицы в базе загрузка туда всех данных из файла и работа с этой таблицей по окончании сбрасывание с таблицы в фаил что то типа архива и удаление таблицы.

    Не пинать если сказл глупость:)
     
  11. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    а у меня без кук и без доп. таблиц. Если юзер не открывал тему - она с любого пк будет непрочитанной. Вот и думайте :)
     
  12. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Апельсин, был на Вашем сайте, дизайн понравился, всё стильно и продумано. Конечно алгоритм не узнал, но главное знаю, что есть к чему стремиться и куда развиваться. Спасибо, что оставили надежду =)
     
  13. NR55RU

    NR55RU Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Апельсин ну можешь хотя бы дать направление ?:)
    В любом случае надо где-то сохранить информацию о просмотре а это:
    1. База
    2. Файл
    3. Куки

    Я когда только сделал первый запрос в базу в жизни написал для себя небольшую систему, если перефразировать ее на тему форума то просмотры я хранил так.
    В информации о теме была ячейка куда я просто записывал ID тех кто заглянул в эту тему без всякого времени и прочего (пример #1#45#234#), есть ID в поле значит смотрел, нету значит не смотрел, если в теме происходят изменение ячейка просто очищается а значит в ней больше нет ID со всем последствиями в плане того что пользователь не видел тему. Никаких проверок на тему дат и времени просто проверка на наличие ID в ячейке и все.

    Эта идея до безумия простая и имеет свои плюсы и минусы:
    + в том что база по сути постоянно регулируется, каждый раз при изменении в теме ячейка очищается короче данные не увеличиваются в геометрической прогрессии.
    - в обработке таких ячеек. Так же размер ячейки не бесконечен.
    Я не очень пока хорошо разбираюсь в работе баз данных и не знаю насколько эффективно работать с подобным типом хранения данных о просмотре.

    С тех пор мне стал интересен поиск более оптимального решения,.
     
  14. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    У меня с помощью доп поля (TEXT) у юзера. В него записываются сериализованные пары дата:топик. Остальное уже сами додумывайте, особо сложного там нет.
    Кому то больше понравится вариант с доп. таблицами, но я не захотел так делать - лишние запросы в базу займут больше времени чем мой вариант.
    Куки тут вообще не должны фигурировать как вариант - это не тру.
    Мой способ позволяет отметить каждый топик прочитанным/непрочитанным, к тому же выделить родительскую ветку и обозначить, что в ней есть топы с новыми сообщениями. Но нет детализации по сообщениями - то есть видно что в топе есть новые сообщения, но какие именно - нет. Мне этого и не надо было.
    Для оптимизации этого доп. поля нужно дописать алгоритм удаления старых дат топиков. Плюс можно додумать фишку "Отметить все топы как прочитанные"
     
  15. NR55RU

    NR55RU Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Ну собственно то самое что я написал выше тока я для каждого топика сохранял ID пользователей их смотревших в поле ТЕХТ.
    В случае если выбирать между хранить в ячейке пользователя все темы что он смотрел с датой и хранить в ячейке темы просто список ID пользователей её смотревших и просто очищать ее, то вариант хранить пользователей в ячейке темы лучше, меньше запросов меньше напряг, база в размерах растет гораздо тише.

    но есть ли еще более лучший идеологический вариант вот в чем вопрос :)
     
  16. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    хуже этого придумать трудно. Это совсем не то что я описал.
    В моем подходе при 500-х темах вообще не должно быть заметных тормозов. у тебя если 500 чел просмотрит 1 тему - это уже будет кишка, которую постоянно нужно запрашивать с базы для просмотра каждому юзеру. В моем же варианте - у всех 500 чел будет только одна запись про просмотренный топ, что не вызовет нагрузки.
    Когда свыше 500 тем на форуме уже - должен работать алгоритм очистки старых тем.
     
  17. NR55RU

    NR55RU Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Ок взглянем иначе.
    Ты проверяешь были ли изменений в теме.
    Берешь из поля юзера ИД темы и время когда юзер разбираешь из кодом что бы отделить ИД от времени и составить запрос в базу, потом просишь базу проверить че там с вопросом времени изменений.
    А теперь у тебя 100 тем и тебе поочередно надо взять каждую тему из данных пользователя и сверить ее с датами обновления тем на форуме можно и иначе но от перестановки ест слагаемых сумма не измениться.

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

    И того ты проходишь по 100 темам и записываешь в 1 ячейку 100 записей достаточно длинных ИД темы и дата.
    Я прохожу по 100 темам и записываю в 100 ячеек по одной записи которая еще и короче в несколько раз. И дает мне быстро если это надо информацию о том какие пользователи уже видели изменения если это мне надо, тебе что бы получить эти данные придеться прогуляться по всем пользователям задавая вопросы каждому а был ли ты там не позже такого то времени.

    Посему пока что неубедительны твои слова на тему хуже этого быть не может.
     
  18. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    одни двойки... [​IMG]
    я уже обьяснил, что никаких подзапросов я не делаю. до мелочей и готового кода разжевывать я не собираюсь.
     
  19. NR55RU

    NR55RU Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Готовый код мне не интересен, мне интересна общая идеология и именно о ней и речь а не о деталях реализации.
    И в идеологии своей твой и мой вариант фактически одно и то же с оговоркой что каждый более лучше подойдет для одной задачи и хуже для другой, ну и вопрос детальной реализации играет не последнею роль.
    Суть обоих вариантов что данные о просмотре пишутся в одну ячейку а уж пользователя или темы это уже кому как по вкусу.

    Есть еще у кого какие идее кроме описанных выше ? :)
     
  20. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Это назвается денормализация базы.
    На одном джойне сэкономил, да. Зато теперь гоняешь огромный текстовый блок даже когда это совсем не нужно (просмотр темы). Плюс так себе логика на отсеивание старых и удаленных тем будет, тогда как можно было обойтись одним красивым запросом.
    ЗЫ: а куки используются для того, что бы такой же функционал работал и не для зарегистрированных
     
  21. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    я никому не навязывал своего решения. "бутылочным горлышком" в большинстве случаев является ожидание ответа от бд и поиск по ней, а не обработка данных через пхп. делайте "красивый джоин", кто ж запрещает.