Хранение списка «Пользователи в сети» для приложения чата (php / ajax) - PullRequest
2 голосов
/ 29 ноября 2010

У меня есть несколько чатов. В настоящее время я храню список пользователей чата в переменной php. Если пользователь входит или выходит из комнаты, имя пользователя добавляется / удаляется из этого списка. Чтобы сделать это хранилище постоянным, я использую memcached. Чтобы обновить статус комнаты чата и отправить список пользователей всем пользователям в комнате чата, я использую периодические запросы ajax, которые загружают список пользователей в браузеры пользователей, которые находятся в чате.

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

Как чаты обычно решают эту проблему?

Ответы [ 6 ]

2 голосов
/ 29 ноября 2010

Понятия не имею, как они, но вот несколько способов, которыми вы могли бы. Не забудьте измерить до и после оптимизации.

  • Версия списка. Не получайте полный список, если у вас обновленная версия.
  • Разбери список. Отправлять только обновления с момента последнего обновления.
  • Записать этот список. Кэшируйте или отправляйте обновления по мере возникновения новых событий.
1 голос
/ 29 ноября 2010

Можно передавать данные с сервера на клиент (/27427/est-li-kakoi-nibud-sposob-dlya-peredachi-dannyh-s-veb-servera-v-brauzer). Однако, если вы все еще хотите выполнить опрос, я бы реализовал нечто подобное ответу HTTP 304.

1 голос
/ 29 ноября 2010

При работе с чатами я отмечаю все новые сообщения, новые входы и выходы по времени.

Когда пользователь входит в комнату, я загружаю полный список.Периодически (через AJAX с вызовом JSON) я буду загружать любые новые события (сообщения, логины и выходы из системы).И обновите соответствующие списки соответственно.

0 голосов
/ 30 ноября 2010

Спасибо за все предложения. Кроме того, я рассмотрю запуск комет-сервера. Подход с длительным опросом не очень хорошо масштабируется.

0 голосов
/ 29 ноября 2010

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

<script>updateUserlist({user:"alice", eventtype:"leave"});</script>
0 голосов
/ 29 ноября 2010

Честно говоря, то, что вы делаете, звучит довольно хорошо. Продолжай делать то, что делаешь. Может быть, отслеживать последний список и отправлять обновления только в том случае, если они изменились в последний раз? Если вы действительно хотите сохранить несколько байтов.

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