Количество непрочитанных сообщений в приложении PHP
В настоящее время я занимаюсь разработкой простого приложения PHP, где пользователи могут отправлять сообщения друг другу. Сообщения хранятся в базе данных SQL. Я хотел бы добавить количество непрочитанных сообщений в меню на каждой странице, чтобы пользователь мог быстро увидеть, есть ли у него новые сообщения, без периодической проверки входящих сообщений.
Хотя это может быть легко решаемой проблемой, я не знаю, какой будет лучший метод с точки зрения производительности:
- Делает простой SQL COUNT() непрочитанных сообщений при каждой загрузке страницы (мгновенно уведомляется об изменениях, но это может плохо повлиять на производительность?)
- Сделайте то же самое, но кешируйте результат в течение X минут (мы создаем раздражающую задержку)
- То же, что и 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, когда сообщение было загружено.