2012-01-09 1 views
2

Я пишу простое приложение, которое очень похоже на приложение для чата с точки зрения его использования. Хост начинает «комнату», участники могут присоединиться и отправить сообщения в указанную комнату.Эффективность/накладные расходы EventSource против опроса ajax?

Я стараюсь сделать это максимально простым для кодирования. PHP на бэкэнд без каких-либо фантазий.

Моя первая мысль состояла в том, чтобы просто опросить ajax от клиентов, чтобы узнать, опубликовано новое сообщение в комнате. Затем я подумал, что это вызывает безумное количество запросов на сервер (если они крошечные, но все же).

Затем я просмотрел несколько способов HTML5 и нашел EventSource - это кажется правильным в теории, но мне интересно, что под обложками он просто опросил ajax в любом случае.

Тогда есть комета, но для этого также требуется компонент на стороне сервера, который я не очень хочу настроить.

Я думаю, что могу использовать длительный опрос - это лучший подход?

Кроме того, как вы минимизируете запросы db от всех клиентов, запрашивающих новые данные?

ответ

4

Я думаю, что короткий опрос является самым простым для кода, но он может создать ненужную нагрузку на сервер.

Длинный опрос более эффективен, но у вас должен быть сервер, способный эффективно поддерживать много-много соединений (то есть не Apache).

И да, EventSource - это просто прославленный длинный опрос, но с ним приятно работать.

Отвечая на ваш второй вопрос: лучший способ свести к минимуму количество запросов db - не делать запросы db. Например, поместите вещи в memcached.

+1

, но опрос EventSource каждые 3 секунды по умолчанию. Я знаю, что вы можете изменить это время, но я подумал, что идея с длинным опросом заключается в том, что вы настроили один запрос, и он просто ждет, пока есть данные - как вы это делаете с eventource? –

+8

Нет, EventSource пытается * повторно подключить * каждые 3 секунды. Если вы не закрываете соединение, он сразу же получит обновления. –

+0

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

1

Sergio предоставил хороший ответ на вопрос EventSource. Он также утверждает, что Apache не будет масштабироваться для обработки множества одновременных/одновременных соединений. У PHP на Apache есть эта проблема - особенно если вы используете общий хостинг.

Лучшим решением для PHP является аутсорсинг веб-коммуникаций в реальном времени и распространение сообщений. Вы можете сделать это самостоятельно, используя self hosted realtime web solution ...

Тогда есть комета, но это также требует компонент на стороне сервера, что я не слишком нетерпелив, чтобы настроить.

Но это звучит как ваш не стремится установить, что. Итак, ваш лучший вариант - это веб-решение в реальном времени, такое как Pusher (для кого я работаю), который использует WebSockets. Используя такую ​​услугу, вы можете реализовать приложение чата следующим образом:

  • Когда пользователь присоединяется к комнате они подписаться на chat-channel. Имя может быть специфичным для темы разговора, например.chat-fishing (подробнее о каналах here)
  • Когда пользователь отправляет сообщение в чате сервер получит это сообщение (возможно с помощью запроса AJAX)
  • Вы бы обновить базу данных с новым сообщением
  • После DB имеет успешно обновленный, вы можете затем распространять (транслировать) это сообщение каждому пользователю в той же комнате чата, вызывая событие new_message на канале chat-channel. Это делается с помощью RESTful API с размещенным сервисом, используя PHP library (который включает любые функции, такие как аутентификация, требуемая API RESTful).
  • Сообщение получено подключенными клиентами.

tech example in this presentation должен продемонстрировать преимущества нашего использования в распределении сообщений.

Существует хороший учебник о how to build a chat application using PHP with Pusher on Nettuts+.

Несмотря на то, что это решение и ответ очень ориентированы на толкание, концепции (преимущества аутсорсинга, подписки, каналы и события) применимы ко всем realtime hosted services, которые поддерживают клиентский клик в режиме реального времени.

+0

интересное решение. Я хочу сделать это бесплатно, по крайней мере на ближайшее будущее - или, скорее, не больше, чем то, что я плачу за хостинг сейчас, и я не думаю, что DH делает какой-либо хостинг в реальном времени ... хорошо знать об этом хотя - спасибо! –