Количество непрочитанных сообщений в приложении PHP - PullRequest
2 голосов
/ 02 мая 2011

В настоящее время я разрабатываю простое PHP-приложение, в котором пользователи могут отправлять сообщения друг другу.Сообщения хранятся в базе данных SQL.Я хотел бы добавить количество непрочитанных сообщений в меню на каждой странице, чтобы пользователь мог быстро увидеть, есть ли у него новые сообщения, без периодической проверки входящих сообщений.

Хотя это может быть простой проблемойрешить, я не знаю, какой будет лучший метод, с точки зрения производительности:

  1. Делать простой SQL COUNT () непрочитанных сообщений при каждой загрузке страницы (мгновенно уведомляетсяизменений, но это может негативно повлиять на производительность?)
  2. Делать то же самое, но кэшировать результат в течение X минут (мы создаем раздражающую задержку)
  3. То же, что и2., но обновляется только тогда, когда мы читаем сообщение или когда нам отправляется сообщение (может израсходовать много ОЗУ / загрузить диск, так как мы создаем одну постоянную запись / файл для пользователя: мыне могу сохранить его в $ _SESSION, потому что нам нужно обновить его, когда другой пользователь отправляет нам сообщение)

Все мои решения основаны на серверах, потому что я не очень знаком с JS,Но если есть лучшее решение с использованием JavaScript, ничего страшного.

Спасибо за помощь!

Ответы [ 4 ]

2 голосов
/ 02 мая 2011

Я бы предложил 4'th:

Как только новое сообщение было отправлено пользователю, вы обновляете счетчик в memcache.Вы создаете простое ajax-приложение на стороне клиента, отправляя запрос каждые X секунд.На стороне сервера вы просто проверяете, есть ли непрочитанные сообщения.При обновлении страницы вам не нужно запрашивать базу данных, поскольку вы получаете счет от memcache очень быстро.

Это то, что я сделал бы, если бы у меня было узкое место в БД (в 90% случаев БДсамая недельная часть любого приложения, управляемого базой данных).

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

1 голос
/ 02 мая 2011

Сделать простой SQL COUNT () из непрочитанного сообщения на каждой странице загрузки (мгновенно уведомлены об изменениях, но это может повлиять производительность плохо?)

Пока у вас приличная структура таблиц, COUNT () - довольно быстрая команда. Я бы не кешировал эту конкретную команду. Вместо этого я бы поработал с другими запросами, чтобы убедиться, что вы возвращаете только те данные, которые вам нужны, при отображении их в списке. Например, если вам нужен только отрывок, я обязательно сделаю что-то вроде этого:

SELECT id, author, msgdate, substring(body, 0, 50) from table where recipient = ?

вместо

SELECT * from table where recipient = ?;
1 голос
/ 02 мая 2011

Я бы выбрал третий вариант, но я бы добавил memcached в качестве решения 4.

0 голосов
/ 02 мая 2011

Имхо. Лучше всего позволить клиенту пропинговать сервер и отправить json обратно с количеством непрочитанных сообщений. Подсчет в mysql должен быть быстрым, поэтому я не вижу причин не использовать его. Просто отфильтруйте результаты в чате.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...