[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Письмо юзеру
SunSet
Вопрос в следующем. Например, есть сервис регистрации пользователей, есть у них личная страничка, где указана разного рода инфа о них - статистика, вобщем говоря. Как осуществить отправку и прием личных сообщений между двумя юзерами? Вот как на этом форуме, например. Жмешь кому отправить - а второй, когда зайдет, увидит новое сообщение.
Куда это сообщение записывается, где хранится и как удаляется?



Спустя 6 минут, 45 секунд (14.10.2009 - 19:10) Gabriel написал(а):
наверное создаеться:
1. таблица: лс.
2. поля: отправитель, получатель, сообшение, тема, сообшения, дата отправки.
водь гдето так

Спустя 8 минут, 45 секунд (14.10.2009 - 19:19) SunSet написал(а):
Gabriel
Ну, это понятно. А как осуществляется доставка нового сообщения. В базу оно записалось, а дальше то что.. при каждом обновлении страницы юзера смотреть в базу, нету ли для такого то ид нового сообщения... blink.gif

Спустя 54 минуты, 50 секунд (14.10.2009 - 20:14) sergeiss написал(а):
Цитата (SunSet @ 14.10.2009 - 20:19)
при каждом обновлении страницы юзера смотреть в базу, нету ли для такого то ид нового сообщения...

А что, есть другие варианты?

Спустя 1 минута, 27 секунд (14.10.2009 - 20:15) SunSet написал(а):
sergeiss
так для того и спрашиваю, чтоб узнать smile.gif

Спустя 2 часа, 35 минут, 58 секунд (14.10.2009 - 22:51) Nikitian написал(а):
Есть вариант сразу доставлять, если пользователь онлайн. Скажем клиент держит постоянное соединение с сервером, а демон на серваке шлёт данные тем, кому нужно. Подробнее тут

Спустя 15 часов, 48 минут, 24 секунды (15.10.2009 - 14:39) SunSet написал(а):
Не могу вот понять одной штуки. Как полагаю, все сообщения не гуманно держать в одной таблице.
1. Значит, каждому юзеру отдельную таблицу или как (для личных сообщений)?
2. Когда юзер 1 отправляет сообщение юзеру 2, где хранится вот это непрочитанное сообщение? И куда оно потом попадает? Да и как вообще происходит проверка на то, есть ли новые сообщения юзеру 2 или нет.. blink.gif

Спустя 6 часов, 46 минут, 44 секунды (15.10.2009 - 21:26) SunSet написал(а):
Ну хоть бы подсказку какуюто.. blink.gif

Спустя 33 минуты, 59 секунд (15.10.2009 - 22:00) twin написал(а):
Цитата
1. Значит, каждому юзеру отдельную таблицу или как (для личных сообщений)?
как раз не гуманно. В одной и надо. Просто можно старые архивировать в другую таблицу или вообще сносить. Предупредить, что сохраняются месяц к примеру. Или как тут - лимит поставить. 100 штук в одни руки. Чтоб сильно таблица не пухла.

Цитата
2. Когда юзер 1 отправляет сообщение юзеру 2, где хранится вот это непрочитанное сообщение? И куда оно потом попадает? Да и как вообще происходит проверка на то, есть ли новые сообщения юзеру 2 или нет..

Тут кто во что горазд. Я делаю все в кучу, чтоб оба могли читать на одной странице, не как тут. А кто читал нечитал - флагами. Делаешь поля в таблице и ставишь флаги.

Спустя 2 минуты, 2 секунды (15.10.2009 - 22:02) twin написал(а):
Да, кстати. На флэшке можно сделать онлайн оповещалку. Если интересно как работает вся эта кухня снаружи, вот тут можно посмотреть.

Спустя 52 минуты, 38 секунд (15.10.2009 - 22:55) SunSet написал(а):
twin
С первым вопросом более-менее понятно, старые или вне лимита 100 сообщений - удалять.
А с флагами чтото не очень понял.. смутно представляю себе таблицу для всех сообщений. Допустим, записывается сама месага, ид отправителя, ид получателя. Что дальше? Как получатель узнает о том что там для него сообщение?
Флеш не катит.. sad.gif

Спустя 9 минут, 16 секунд (15.10.2009 - 23:04) vagrand написал(а):
AJAX. Каждые несколько минут запрос к скрипту который проверяет наличие новых месаг для юзера

Спустя 2 минуты, 20 секунд (15.10.2009 - 23:06) SunSet написал(а):
vagrand
Может, когдато в будующем, когда пхп нормально освою smile.gif Пока без аякса буду мудрить. Куча сайтов где доставка без аякса производится. Черт с обновлением страницы, это нормально, интерисует принципиальная схема отправки/доставки сообщений.

Спустя 5 минут, 4 секунды (15.10.2009 - 23:11) vagrand написал(а):
SunSet
Месаги никуда не "доставляються". Они в базе уже сразу после сохранения. А если получатель сидит и читает какую-то увлекательную статью а не гоняет по сайту как угарелый то он не узнает о том что для него кто-то месаг в базу сохранил если ты не будеш реквесту к php посылать. Лично я знаю только 3-и способа посылки реквестов к серверу без перезагрузки всей страницы: AJAX, IFrame и Flash

Спустя 4 минуты, 11 секунд (15.10.2009 - 23:16) twin написал(а):
Цитата
Что дальше? Как получатель узнает о том что там для него сообщение?


Флаааг. Проверяй, если юзер запрашивал скрипт, ставь галочку. и по этой ячейке ориентируйся. нет галочки - не читал. Есть - прочитано.

Спустя 1 минута, 25 секунд (15.10.2009 - 23:17) SunSet написал(а):
vagrand
та забудь уже об обновлении, с этим уже решил - обновил страницу- увидел месагу. Я про другое спрашиваю - представь что есть такая таблица для всех сообщений. Представим что у нас 1000 юзеров, а это мелочи, если сравнивать с однокласниками и им прочей фигней. Вот эта тысяча юзеров наговорила аж по 100 сообщений. Всего в базе 100000 сообщений. При каждом обновлении страницы для любого пользователя производить полный поиск по такой таблице в 100000 записей? Ресурсов так не напастись если сразу хотя б человек 30 нажмут "обновить"

twin
Начинаю понемногу понимать smile.gif

Спустя 9 минут, 6 секунд (15.10.2009 - 23:26) twin написал(а):
Цитата
Ресурсов так не напастись если сразу хотя б человек 30 нажмут "обновить"

Для этого делается другая таблица. для зуммера. в неё пишутся иды непрочитанных и удаляются когда прочитают.

Спустя 3 минуты, 2 секунды (15.10.2009 - 23:29) vagrand написал(а):
SunSet
> При каждом обновлении страницы для любого пользователя производить полный поиск по такой таблице в 100000 записей?

Это еще зачем? Чтобы узнать что у конкретного пользователя появилось N-ое количество непрочитаных месаг "полный поиск" не нужен.

Спустя 1 минута, 50 секунд (15.10.2009 - 23:31) SunSet написал(а):
twin
эээ..то есть дублировать сообщение в две таблицы: основная и вот эта для проверки новых? И при обновлении проверяется только вторая, для непрочитанных? blink.gif

vagrand
Выслушаю все варианты smile.gif

Спустя 1 минута, 53 секунды (15.10.2009 - 23:33) vagrand написал(а):
SunSet
twin тебе уже выдал наилучший вариант

Спустя 1 минута, 53 секунды (15.10.2009 - 23:35) twin написал(а):
Цитата
эээ..то есть дублировать сообщение в две таблицы: основная и вот эта для проверки новых?

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

Спустя 1 минута, 19 секунд (15.10.2009 - 23:36) sergeiss написал(а):
Можно попробовать немного пооптимизировать БД smile.gif

Делаем дополнительное поле в таблице с юзерами. Как только появляется новое сообщение для юзера, так сразу же там ставится TRUE. А после прочтения юзером сообщений ставится FALSE.
Если юзер зашел на сайт, или просто обновил какую-то страницу, то только проверяется одно поле в таблице юзеров.
Собственно выборка/анализ новых (старых) сообщений пусть делается только тогда, когда юзер зашел на соответствующую страницу. Это будет происходить все-таки реже, чем просто обновление страницы или другие перемещения по сайту.

PS. Пока писал, уже что-то похожее ответили... Но все равно не то же самое.

Спустя 8 минут, 9 секунд (15.10.2009 - 23:44) SunSet написал(а):
twin
Что за онлайн оповещалка? Как я планирую - там не будет некого рода чата, но доставка сообщений - да, как тут например.


sergeiss
Вариант интересен. Даже если заносить такую запись "есть или нету сообщение", можно сразу в строку юзера (его имя, ид и прочее). Вроде и не так требовательно к ресурсам будет

Спустя 15 минут, 8 секунд (15.10.2009 - 23:59) SunSet написал(а):
sergeiss
И твой вариант предполает только две таблицы - для юзеров (общая) и для всех сообщений, так?

Спустя 9 минут, 59 секунд (16.10.2009 - 00:09) sergeiss написал(а):
Цитата (SunSet @ 16.10.2009 - 00:59)
И твой вариант предполает только две таблицы - для юзеров (общая) и для всех сообщений, так?

Ну да, так. А куда больше-то? blink.gif

Я тут посмотрел...
То, что twin написал
Цитата (twin @ 16.10.2009 - 00:16)
Флаааг. Проверяй, если юзер запрашивал скрипт, ставь галочку. и по этой ячейке ориентируйся. нет галочки - не читал. Есть - прочитано.

и то, что я сказал - одно и то же, вобщем-то rolleyes.gif Только разными словами сказано, я чуть подробнее расписал. Но суть одна и та же.

И насчет ресурсов - для того этот вариант и предлагается, что ресурсов будет меньше затребовано. Причем существенно меньше.

Спустя 38 секунд (16.10.2009 - 00:10) twin написал(а):
sergeiss
Цитата
Делаем дополнительное поле в таблице с юзерами.

Это не вариант. У меня на одном сайте около 400 000 юзеров зарегано. И у каждого куча данных. Если дергать эту таблицу при каждом заходе на страницу - мускул падает. Я дергаю её только при первом заходе, потом сессия.

Так что отдельная таблица для зуммера - оптимальное решение.

Спустя 3 минуты, 18 секунд (16.10.2009 - 00:13) SunSet написал(а):
Зуммер.... новая строка... или зуммер.. или новая строка... sad.gif
Как же делать тогда?:

Спустя 15 минут, 17 секунд (16.10.2009 - 00:29) kirik написал(а):
У меня реализован вариант похожий на тот, что написал sergeiss. Только вместо true и false записываются сообщения +1 когдя юзер получает сообщение, -1 когда читает непрочитанное сообщение. Сообщения лежат в отдельной таблице с полем status которое может принимать одно или несколько значений из (прочитано|удалено отправителем|удалено получателем). Например когда получатель пытается удалить сообщение, проверяется бит "удалено отправителем", если он 1, то просто удаляем сообщение из таблицы (по такой же схеме и с отправителем).

Спустя 4 минуты, 9 секунд (16.10.2009 - 00:33) SunSet написал(а):
kirik
Трудно для моего понимания blink.gif Сколько у тебя таблиц участвуют в этой порнографии? smile.gif)))

Спустя 4 минуты, 18 секунд (16.10.2009 - 00:37) twin написал(а):
Цитата
Зуммер.... новая строка... или зуммер.. или новая строка... 
Как же делать тогда?

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

Спустя 9 минут, 45 секунд (16.10.2009 - 00:47) SunSet написал(а):
twin
Мдя.. теперь уяснил. Более-менее понимаю.
Еще вопрос волнует, но не по теме - когда юзер заходит в свой аккаунт, запись в сессию происходит. И в строке браузера как бы ничего не отображается. Но иногда вижу что к строке прибавляется ид его или как назвать.. ну типа такого index.php?any=3527352527529875298572093580295.
Это что?

Спустя 4 минуты, 41 секунда (16.10.2009 - 00:51) kirik написал(а):
Цитата (SunSet @ 15.10.2009 - 16:33)
Сколько у тебя таблиц участвуют в этой порнографии?

Две: таблица юзеров и таблица сообщений smile.gif

Спустя 2 минуты, 8 секунд (16.10.2009 - 00:54) twin написал(а):
Цитата
Это что?

Это SID. идентификатор сессии. Лепится тогда, когда не получается поставить сессионную куку.

Спустя 2 минуты, 3 секунды (16.10.2009 - 00:56) SunSet написал(а):
kirik
Спасиб, с таблицами уже по полкам все разложили smile.gif Могу спать спокойно)
Еще про вот этот sessionid или что оно понять... mod_rewrite потом както буду разбирать.. rolleyes.gif


twin
Автоматом лепится или требует вмешательства десяти пальцев? smile.gif То есть если собираюсь "вести" пользователя по его сессии ($_SESSION) то этот индификатор не понадобится?

Спустя 5 минут, 1 секунда (16.10.2009 - 01:01) twin написал(а):
Цитата
индификатор не понадобится?

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

Спустя 4 минуты, 18 секунд (16.10.2009 - 01:05) SunSet написал(а):
twin
laugh.gif
Быстро набирал - опечатался. Понятное дело что идентификатор. Я это еще зазубривал, когда пытался запомнить "идентификационный код" tongue.gif


_____________
... и помните! Каким бы ни был PHP, главное - чтобы он был защищенным! :) (PHP с Анфисой Чеховой)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.