Вы не вошли.
Страницы 1
Сейчас ситуация такая:
На работе захожу в раздел вижу что в темах есть новые сообщения. Открываю эти темы, смотрю. Теперь на этом компьютере у просмотренных тем нет отметки о новых сообщениях.
Дома (на другом компьютере) в разделах снова есть отметка о новых сообщения в тех темах которые просмотрел на работе, хотя фактически новых сообщений небыло.
Уверен что будет гораздо лучше что-бы информация о прочитанных сообщениях не привязывалась к компьютеру/браузеру.
Сейчас информация о прочитанных темах хранится в куках, таким образом достаточно зайти с другого браузера на одном и том же компьютере, чтобы наблюдать описанный эффект. Более того, теоретически при количестве тем с непрочитанными сообщениями большем некоторого порога (порог - от 300 и меньше в зависимости от длины идентификаторов темы), может наступить такой момент когда при прочтении новой темы одна из самых первых прочитанных становится вновь непрочитанной :) На всякий случай замечу, что непрочитанными считаются сообщения с момента последнего визита, который определяется либо временем нажатия на "Выход" в меню, либо время последней активности на форуме в случае, если не было логаута, но прошло времени больше, чем "таймаут визита" (настраивается в админке, в нашем случае - около 28 часов).
Почему изначально было сделано именно так - снижение нагрузки на сервер и на базу данных (ну может быть и еще какие-то причины). Если не применять никаких оптимизаций, то при определенном уровне посещаемости и количестве тем, информация о прочитанности может начать превышать по объему суммарный размер всех сообщений. Отсюда естественным ограничением будет срок хранения информации. Все сообщения старше N дней будут автоматом считаться прочитанными.
Добавление режима с хранением информации о прочтении на сервере, а также переключение между режимами (для снижения нагрузки на сервер для тех кому это надо), есть в планах, но по срокам пока ничего конкретного сказать не могу.
Здесь даже к браузеру не привязывается. Только что ходила по разделам, и там непрочитанные сообщения, которые я оставляла вчера, которые просматривала вчера и сегодня утром.
Ну максимум что я смог добиться от движка в плане проявлений описываемого тобой бага, это вот:
А когда путешествую по разделам, у меня ни разу не получалось так, чтобы прочитанное вдруг вновь становилось непрочитанным в том же браузере, если я не чистил куки или еще чего-нибудь такого. Поэтому не знаю с чем бороться. Код смотрел, ничего подозрительного там не увидел, все вроде бы как и надо: сначала сравнивает дату последнего сообщения в теме с датой последнего визита, потом проверяет нет ли в куках записи о прочтении данной темы, если есть, то сравнивает дату прочтения.
Перечитывал старые темы, наткнулся на мысль, которая приходила мне в голову несколько раз недавно:
Пометка изменившихся сообщений как новых
Вещь однозначно нужная.
Сегодня смог наблюдать описываемое поведение.
Вечером оставил браузер с открытой страницей новых сообщений, где почти все были помечены как прочитанные. Логаута не делал. Утром нажимаю на ней F5, и вижу помеченными непрочитанными даже те, что сам оставлял.
Лезу смотреть cookie и вижу полное отсутствие cookie с информацией о прочитанных сообщениях. Cookie с информацией о логине на месте. Захожу в эту тему (она у меня вновь непрочитанная), соответствующая печенька (cookie) появляется и содержит ID только этой темы.
Теперь вопрос: кто съел печеньку - браузер или движок?
Буду выяснять.
-----------------------
И еще сегодня-завтра переименую cookie с 'punbb_cookie' на 'samovarchik_cookie'. Или вообще просто на 'samovarchik', а то если смотришь куки и так понятно, что это куки, а длина одной cookie не резиновая :)
Ну максимум что я смог добиться от движка в плане проявлений описываемого тобой бага, это вот:
Т.е. те, что я прочитал по-прежнему там присутствуют, но уже с бледным маркером.
Не знаю, задумывалось ли так ребятами из команды fluxbb.org, но мне такое отображение кажется странным.
Вчера в разговоре с Пашей затронули этот вопрос. В общем - это правильное поведение. В списке Новых отображаются темы с новыми сообщениями с момента последнего визита. И то, прочитал их пользователь или нет, не меняет дату их публикации. Т.о. они должны присутствовать в этом списке даже после прочтения. А наличие маркера позволяет сказать, какие из них прочитаны, а какие нет.
Теперь вопрос: кто съел печеньку - браузер или движок?
Буду выяснять.
Сегодня опять изучал код, одновременно с этим экспериментировал и следил за тем, чтобы состояние кук и соответствующих полей в базе данных соответствовало тому, что я вижу в коде.
Срок годности (Expiration time) cookie авторизации и cookie пометок о прочтении обновляются одновременно независимо от того, какая страница сайта открывается. Если при входе на сайт поставить галочку "Узнавать меня ...", то время жизни cookie авторизации становится в разы больше, чем сейчас задан таймаут визита в админке, в то время как у cookie пометок он так и остается равен таймауту визита. Т.е. ситуация с истечением срока у последней при сохранении первой - вполне нормальное явление, только к этому моменту значение 'last_visit' у пользователя должно замениться на время последней активности, т.е. все темы с сообщениями написанными до момента последней активности, становятся прочитанными.
Возникла еще одна мысль, что что-то могло случиться с таблицей online в базе данных.
Т.к. она хранится в оперативной памяти, то перезагрузки сервера вполне достаточно. Хранение этой таблицы в оперативной памяти уходит корнями еще к PunBB не знаю какой версии. PunBB-PE и FluxBB 1.4 тоже так делали, но вот в последней версии FluxBB по ветке 1.4.* ее стали хранить на жестком диске (А при использовании MySQL InnoDB - еще раньше). Думаю, что и нам стоит перенять это новшество.
Кстати, если после того как пользователь залогинился и просмотрел несколько топиков, насильственно очистить таблицу online, то при следующей проверке cookies движок сам же и очистит cookie пометок, т.к. будет думать, что произошел таймаут визита (а значит данные в ней уже устарели). При этом, т.к. 'last_visit' никто не менял, то уже просмотренные (и даже созданные самим пользователем за это время) темы будут вновь новыми.
Ммм, и еще.
Почему я пишу сообщение вчера, а сегодня он мне моё же сообщение выдает как непросмотренное и новое? Смысл?
Браузер один и тот же?
И как вариант ответа - тут.
P.S. Да, надо до конца декабря постараться и сделать пометку сообщений прочитанными с хранением пометок в БД.
Чтобы подтвердить догадку, высказанную во второй половине сообщения, через phpMyAdmin удалил себя из таблицы 'online'. Как и ожидалось, все сообщения с момента последнего нажатия на "Пометить все как прочтенное" стали вновь новыми для меня.
Поменял все через тот же phpMyAdmin тип движка таблицы с Memory на MyISAM (чтобы совпадал с другими таблицами). Если я прав, то при использовании одного и того же браузера спонтанное отмечивание уже прочитанных сообщений как новых должно прекратиться.
На быстродействии сказаться не должно - таблица относительно маленькая и часто обновляемая, по-идее копия должна постоянно присутствовать в кэше MySQL (т.е. в оперативной памяти).
P.S. Это не значит, что я опровергаю необходимость добавить возможность хранить пометки о прочтении в БД. Просто ищу как должно быть правильно при том способе, который используется сейчас. В том же PunBB и FluxBB изначально таблица 'online' хранилась в оперативной памяти. Кто помнит, как в PunBB 1.2 (1.3 я не видел, не знаю как там), и как в FluxBB до версии 1.4 сообщения помечались прочитанными, поймет почему случайная очистка таблицы online (например перезагрузка сервера БД или самого демона mysqld) должна была быть незаметной для пользователей.
Редактировался yoorick (28.11.2011, 15:11:29)
Нашел еще одно подтверждение, что периодические сбросы пометок о прочтении - следствие очистки таблицы online:
This MySQL server has been running for 1 days, 17 hours, 28 minutes and 56 seconds. It started up on Nov 26, 2011 at 08:40 PM.
Поэтому вчера вечером я видел свои же субботние сообщения как новые. (Там время MSK, то есть по Омску это будет 11:40 PM или 23:40)
Это говорит о том, что если у нас что-то важное и долговременное опирается на таблицу 'online', то она должа храниться на жестком диске, чтобы без потерь пережить перезагрузку сервера.
upd:
Пара ссылок на тему таблицы online
Редактировался yoorick (29.11.2011, 13:34:45)
Вчера независимо друг от друга и почти одновременно пришли с Илоной к выводу, что было бы удобно иметь возможность в списке новых сообщений не открывая темы помечать ее прочтенной (и наоборот возвращать на место пометку о непрочтении). Теперь я знаю как чувствовали себя ученые, о которых в учебниках пишут "независимо друг от друга в N-ом году сделали такое-то открытие". Для этого можно было бы сделать пометки (цветные пирамидки слева от тем) кликабельными.
Похоже пора изучать Ajax, т.к. перезагружать каждый раз страницу ради одной пометки накладно. В случае же с тем, как пометки хранятся сейчас, достаточно будет одного JavaScript (и поменять уровень доступа к cookies, чтобы JS мог их модифицировать).
Редактировался Гав (04.12.2011, 12:52:43)
Сейчас занимаюсь добавлением в движок пометки тем прочтенными с хранением этих пометок в БД.
В голову пришла одна мысль, которая не приходила раньше:
В списке новых сообщений отображаются новые сообщения с последнего визита, часть из которых помечена как прочтенные, часть - нет. И это правильно.
Обсуждение на эту тему на fluxbb.org. В частности:
The problem is a confusion between new posts and unread posts. New posts are posts made since your last visit. Unread posts are a subset of new posts that you have not yet read. It's easy to see that the search is much less useful if it only returns unread posts, since the act of reading a post leaves you with no way to then return to that post other than remembering where it was.
Срок жизни такого списка в основном определяется тем, успевает ли пользователь посещать сайт до того, как истечет Таймаут Визита со времени его последней активности на сайте, или от того, как часто он нажимает на Пометить Все Прочтенным или пользуется пунктом меню Выход. В результате список обычно получается не сильно длинным. Да и то иногда заставляет задуматься "А нет ли там непрочитанного на 2 или 3 странице?".
Хранение пометок в базе данных будет гарантировать, что в этом списке будут присутствовать все сообщения за последние N дней, где N настраивается в админке, и для samovarchik.info скорее всего будет равно 30 дням. Список "новых" сообщений вполне может раздуться до 10-15 страниц... "На какой же из них та тема, которую я заприметил 2 недели назад, но еще не прочитал?"
Сортирование "сначала непрочитанные, за ними прочитанные", равно как и отдельный список непрочитанных, приведут к "Час назад читал тему, там ссылочка полезная была, где же теперь эта тема?", т.к. вполне реально, что тема, еще час назад находившаяся на первой странице списка, после прочтения переместится куда-нибудь на 10ю страницу.
Мое предложение - удалять прочитанные темы из этого списка по прошествии некоторого количества времени (список по-прежнему сортируется по дате последнего сообщения в теме).
Брать в качестве отправной точки тот самый Таймаут Визита не рационально.
Похоже самое простое решение - добавить в админку еще одно поле, задающее интервал в M дней, все прочитанные сообщения старше M дней будут удаляться из этого списка. Именно так я на данный момент планирую сделать.
Есть какие-нибудь другие предложения или возражения?
Редактировался yoorick (24.01.2012, 11:47:58)
Кстати, нашел еще один мод на эту тему:
Track topics in database
Избавляет от привязки к браузеру, но все заморочки с таймаутом визита остаются. Ограничение на количество помеченных тем тоже присутствует, но настолько велико (~4600 тем и меньше, в зависимости от длин идентификаторов тем), что можно его не учитывать.
Страницы 1
[ Сгенерировано за 0.016 сек, 9 запросов выполнено - Использовано памяти: 2.08 MiB (Пик: 2.15 MiB) ]