0

Написал мессенджер: http://rsdn.ru/forum/flame.comp/6042249.1 Он работает на обычных HTTP запросах. Теперь пытаюсь понять, как он должен работать в правильном варианте.

Мне пришло понимание, что надо делать TCP соединение, сервер его авторизовывает, подписывает на обновления и шлет в сокет данные, когда они появились.

Разбираюсь с вебсокетами, и начинаю понимать, что на них никаких подписок не сделаешь. То есть это тот же HTTP, но без разрыва соединения.

Так как же должна строиться система обмена сообщениями, чтобы быть более оптимальной?

  1. В режиме ответов на запросы клиента, плюс присылать уведомления о новых событиях.
  2. В режиме ответов на запросы клиента, но клиент должен сам постоянно посылать запрос на обновление данных.

Первый вариант кажется более оптимальным, но для него потребуется более хитрая логика. Он реализуется на php? Второй вариант более прост, но периодические запросы, скажем каждые 2 секунды, это не кажется оптимальным решением.

mikelsv
  • 3,046
  • 1
  • 20
  • 48
  • Какое-то неправильное понимание. Вебсокеты — это сокеты, и никаких вполне можно реализовать подписки. (Правда, я не разбирался, как. Но на нескольких сайтах такое наблюдал лично.) – andreymal May 08 '15 at 23:21
  • Да, собственно, на StackOverflow именно так и есть :) http://i.imgur.com/YpYygDN.png – andreymal May 08 '15 at 23:24
  • @mikelsv, а на чём реализовали backend, если не секрет- phpDaemon, Ratchet или свой велосипед? "Сейчас: запрос -> apache -> php -> mysql" Хм, меня смущает эта связка. Если не ошибаюсь Apache не умеет проксировать websocket в отличии от того же Nginx (http://nginx.org/ru/docs/http/websocket.html). Ух ты, научился (http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html) И да, с каких это пор MySql (libmysql) научилась работать в асинхронном режиме, если это конечно не mysqlnd? – romeo May 09 '15 at 00:11
  • В том то и дело, что сейчас у меня никаких вебсокетов нет. Я только разбираюсь, как их прикрутить. В идеале хочу свой велосипед. – mikelsv May 09 '15 at 00:19
  • "В идеале хочу свой велосипед" Очень большая ошибка! Из коробки PHP не имеет без танцев с бубном быть параллельным и асинхронным - "PHP создан, чтобы умирать" (http://habrahabr.ru/post/179399/). Но есть лучики в тёмном царстве: Корутины (http://habrahabr.ru/post/164173/) и WSGI (http://habrahabr.ru/post/250055/). Иными словами, приложение или сервер приложений должен работать как event loop. В рамках этого цикла не должно происходить блокировки сторонними сервисами, к примеру, СУБД, т.е. всё должно работать в асинхронном режиме. В некоторых случаях прибегают к сервисам очередей (MQ). – romeo May 09 '15 at 01:16
  • Также необходимо следить за утечками памяти: контролировать статические переменные используемые в приложении,а также, могут "подтекать" и сторонние сервисы/pecl-расширения. Впрочем,для реализации небольшого чата или изменения в real time некоторого новостного блока на сайте вполне можно использовать php. Две библиотеки, которые вам в этом помогут я уже отметил. Для более серьёзных задач посмотрите в сторону node.js с их socket.io (видел примеры браузерных игрушек). Node.js - это яркий пример приложения и сервера в одном флаконе с event loop-ом и асинхронностью на уровне архитектуры платформы. – romeo May 09 '15 at 01:19
  • И да, почитайте один из моих ответов: http://ru.stackoverflow.com/a/392092/10551 – romeo May 09 '15 at 01:19
  • У меня есть два возможных варианта: реализовать на php или написать сервер. На php проще менять логику и проект уже написан под него. Предлагаете не тратить время на php и сразу заняться нормальным сервером? – mikelsv May 09 '15 at 02:39
  • @mikelsv на работе в настоящий момент делаю чат на Websocket. Но не на PHP, а на RoR. С помощью этой библиотеки https://github.com/websocket-rails/websocket-rails . На сервере одновременно запущено приложение, которое обрабатывает обычные запросы, и standalone Websocket сервер, который "висит" на определенном порту. – MAXOPKA May 09 '15 at 06:07
  • "сразу заняться нормальным сервером?" @mikelsv, а вы сдюжите? В протоколе множество нюансов, к примеру, имеется несколько драфтов. Если всё-таки спортивный интерес берёт своё, то курите: https://github.com/ratchetphp/Ratchet/tree/master/src/Ratchet/WebSocket и https://github.com/kakserpom/phpdaemon/tree/master/PHPDaemon/WebSocket. – romeo May 09 '15 at 09:23
  • драфтов? Реализация протокола не самая сложная вещь: http://ru.stackoverflow.com/questions/422766/Описание-протокола-websockets-на-русском-языке. Хватило документации и код phpdaemon помог прояснить ситуацию. – mikelsv May 09 '15 at 13:32

0 Answers0