Количество непрочитанных сообщений в приложении PHP


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

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

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

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

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

Author: Artefact2, 2011-05-02

4 answers

Я бы предложил 4-й:

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

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

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

 2
Author: Nemoden, 2013-08-26 05:32:03

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

 1
Author: Wesley van Opdorp, 2011-05-02 11:03:02

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

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

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

Вместо

SELECT * from table where recipient = ?;
 1
Author: Mike Thomsen, 2011-05-02 11:03:48

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

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

 0
Author: RJD22, 2011-05-02 10:58:53