2010-11-29 2 views
2

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

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

Как чаты обычно справляются с этой проблемой?

+1

Почему бы просто не просто отправить весь список изначально, тогда каждое обновление отправит дельта? –

+0

Как пользователи получают нормальные сообщения? – thejh

+0

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

ответ

2

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

  • версия списка. Не получите полный список, если у вас есть обновленная версия.
  • Diff список. Отправляйте только обновления со времени последнего обновления.
  • Зарегистрируйтесь в этом списке. Кэш или нажмите обновления, когда появятся новые события.
+0

Я не думал о создании номера версии. Звучит интересно. Я думал только об отправке изменений. Если в чате есть 300 человек, обязательно будет иметь значение только для отправки нескольких различий вместо всего списка. – user478419

0

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

0

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

<script>updateUserlist({user:"alice", eventtype:"leave"});</script> 
1

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

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

1

Можно передавать данные с сервера на клиент (http://stackoverflow.com/questions/19995/is-there-some-way-to-push-data-from-web-server-to-browser). Однако, если вы все еще хотите сделать опрос, я бы выполнил что-то похожее на HTTP 304-ответ.

0

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

Смежные вопросы