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

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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

вместо

SELECT * from table where recipient = ?;

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

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

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

Другие вопросы по тегам