Долгий опрос или веб-сокеты

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

Мои технологические варианты кажутся Long Polling и WebSockets, и я пытаюсь выбрать.

Преимущество Long Polling в том, что его очень легко реализовать, и я могу вернуть любые данные, которые захочу (настраиваемый объект JSON с данными, необходимыми для обновления страницы).

Чего я боюсь с WebSockets, так это того, что для него нет собственной библиотеки в PHP, поэтому вам приходится выбирать между различными сторонними, и концепции кажутся более сложными, что с каналами и подписками и что у вас есть.

Совместимость с браузером для меня не проблема.

  1. Производительность Long Polling намного ниже, чем с Websockets? Если нет, то мое решение легко!

  2. Есть ли действительно простой сервер Websocket для PHP? Или концепция настолько проста, что я мог бы написать свою собственную? (У Mozilla есть действительно простое руководство по написанию клиента, но не по сервер).


person forthrin    schedule 09.08.2013    source источник
comment
nginx поддерживает веб-сокеты. Установить его и использовать для передачи данных в ваши php-скрипты? Альтернативой является Node.js, его довольно легко запустить и отправить данные в формате JSON. Видя, что вы говорите о JSON, я предполагаю, что вы знакомы с javascript до такой степени, что можете эффективно использовать Node. Что касается реального сервера, написанного на PHP - это слишком большая проблема, поверьте мне.   -  person N.B.    schedule 09.08.2013
comment
@N.B.: я уже использую nginx. Таким образом, использование поддержки nginx Websocket устраняет необходимость в сервере сокетов? Я просто использую конфигурацию nginx для передачи данных в нужное место? Звучит слишком хорошо, чтобы быть правдой, если это так. Я также хотел бы услышать об аспекте производительности.   -  person forthrin    schedule 09.08.2013
comment
Почему бы не использовать существующий сервер и просто написать внешний интерфейс?   -  person exussum    schedule 09.08.2013
comment
@forthrin из того, что они написали на веб-сайте nginx, поддерживает этот протокол, поэтому это сервер веб-сокетов. Я не пробовал. С другой стороны, вы можете написать свой собственный сервер на PHP. Это всего лишь простой сокет, прослушивающий порт, который должен пройти вызов. В PHPWebsocket есть все, вы можете использовать это для своей базы и настроить. И есть Node.js, который делает использование веб-сокетов очень простым, если вы хорошо разбираетесь в js.   -  person N.B.    schedule 09.08.2013
comment
См. раздел Общие сведения о веб-приложениях PHP в реальном времени.   -  person leggetter    schedule 09.08.2013
comment
@N.B.: Вы знаете, где я могу найти минимальный пример рабочего кода с клиентом JavaScript, соответствующей конфигурацией nginx и сервером PHP (предпочтительно)?   -  person forthrin    schedule 10.08.2013


Ответы (2)


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

Еще одно место, где веб-сокеты экономят на накладных расходах, заключается в том, что после того, как ваше соединение установлено, нет необходимости в постоянных запросах и ответах. Зомби-веб-сокеты практически бесплатны как с точки зрения пропускной способности, так и с точки зрения ЦП.

Наконец, я не думаю, что более простой в реализации будет длинный опрос. Поскольку веб-сокеты предназначены для того, чтобы делать именно то, что вы хотите, я думаю, что использование существующего пакета веб-сокетов фактически сэкономит вам несколько строк кода. Я бы посмотрел на Ratchet (многофункциональный) или phpwebsocket (lite), если вы хотите использовать PHP.

person mattexx    schedule 12.08.2013
comment
Я пробовал phpwebsocket, но server.php не получает Sec-WebSocket-Key1 и Sec-WebSocket-Key2. Вы знаете, как я это исправляю? - person forthrin; 12.08.2013

  1. Long Polling определенно намного хуже, чем Werbsockets.
  2. Не рекомендуется использовать любую библиотеку веб-сокетов с PHP, особенно для чат-приложений.

Вместо этого я предлагаю использовать Python, Ruby или Node.js.

person Al Kafri Firas    schedule 09.08.2013
comment
На самом деле серверная библиотека может быть на любом языке, но мой собственный серверный код, который взаимодействует с базой данных, — это PHP, и я бы предпочел, чтобы он был таким (хотя это и не обязательно). Node не может быть и речи, но я знаю Ruby на приличном уровне. Python, до которого я еще не добрался. - person forthrin; 09.08.2013
comment
Но вы все еще не начали, я думаю. Я предпочитаю Node.js за его производительность и простоту. Тем не менее, я могу помочь вам, если вы решите использовать его. Если вам нужен Ruby, я предлагаю использовать эту библиотеку, а если вы настаиваете на PHP, вот приличная простая библиотека веб-сокетов - person Al Kafri Firas; 09.08.2013
comment
Не могли бы вы уточнить, почему не рекомендуется использовать PHP для веб-сокетов и упомянутых вами языков? Вы никогда не писали, что это ваше личное мнение, поэтому я предполагаю, что у вас должны быть какие-то факты, подтверждающие ваши утверждения? - person N.B.; 09.08.2013
comment
Веб-сокеты еще не популярны, я пытался использовать веб-сокеты с python, PHP и Node.Js, по статистике последний имел лучшую производительность в моих разных случаях (приложение для чата, аналитика пользователей и push-уведомления на Android), я не знать об этом по-прежнему считается личным мнением, но вы можете проверить это статья - person Al Kafri Firas; 09.08.2013
comment
Хорошо, это PHP позади Apache, протестированный на сервере с однопоточным циклом событий. Это как сравнивать мою мышь с бутылкой пива. Я по-прежнему не вижу здесь ни одного факта. Например, правильным тестом будет Node vs PHP за Mongrel2 с использованием LibEV, поэтому мы немного уравниваем игровое поле. Я мог бы предоставить вам результаты, которые сразят Node с такой настройкой. Тем не менее, мне до сих пор интересно, откуда тот факт, что один язык с возможностями сокетов хуже, чем другой язык с такими же возможностями сокетов. - person N.B.; 10.08.2013
comment
@AlKafriFiras: я пытаюсь использовать phpwebsocket из Google Code, но server.php не получает Sec-WebSocket-Key1 и Sec-WebSocket-Key2. Как это исправить? - person forthrin; 10.08.2013
comment
@AlKafriFiras: Вы предложили помощь. Я бы хотел, если это возможно. Как мне связаться с вами? Спасибо! - person forthrin; 15.08.2013
comment
@Н.Б. Я думаю, что вы правы, хотя я люблю PHP, но я не профессионал. - person Al Kafri Firas; 17.08.2013
comment
@forthrin конечно! [email protected] - person Al Kafri Firas; 17.08.2013