#php #websocket #long_poll
LongPolling работает так, что клиент подключается к серверу по протоколу http(s)
и зависает, пока сервер не ответит. После этого создается новое подключение. Это подключение
происходит абсолютно стандартным образом с отправкой всех заголовков и cookie. Для
каждого такого подключения апач (или другой сервер) создает изолированный процесс.
WebSocket в свою очередь подключается к специальному серверу по отдельному протоколу
ws(s). Выходит, что есть всего один процесс, в котором должна проходить авторизация,
и велика вероятность утечек памяти. Но преимущества этого подхода в том, что есть постоянное
подключение, что обеспечивает моментальную реакцию на события. Помимо прочего, в случае
работы с WS не обязательно хранить сообщения где-то в БД, чтобы ничего не было потеряно
при переподключении.
Вопрос вот в чем: есть ли что-то среднее между LP и WS?
Работает по протоколу http(s) со всеми плюшками (headers и cookies)
Можно написать простой PHP скрипт, который будет запускаться по запросу и обрабатывать
все эти подключения, а не пилить полноценный WS сервер, который нужно будет еще мониторить
и следить за тем, чтобы он правильно работал. (P.S. Я в проекте единственный разработчик/дизайнер/верстальщик/сис.админ/другое
слово, поэтому не хочется добавлять себе еще хлопот)
Для каждого подключения спаунит отдельный процесс, изолированный от других подключений
Имеет постоянное подключение. И чтобы можно было отправлять сообщения хотя бы в одну
сторону (сервер => клиент)
Подробнее о том, в чем собственно проблема.
В проекте используется framework Yii2 с местной системой авторизации и со всеми его
плюшками. Описанный мною подход позволил бы мне аутентифицировать пользователя встроенными
в framework методами, а саму логику внедрить в action контроллера.
В противном случае мне нужно будет написать отдельный сервер или использовать готовое
решение и как-то интегрировать его с фреймворком.
Смотрел в строну Workerman. Опять же возникает вопросы аутентификации, поддержки
сервера в рабочем состоянии при утечках и крашах (supervisord?), перезапуска при деплое
Если я где-то заблуждаюсь, тыкните, пожалуйста, пальцем.
Ответы
Ответ 1
Достойных альтернатив для WebSocket в наше время считайте что нет. Или WebSocket, или всевозможные костыли. Если без костылей, то... Первое, что нужно сделать: настроить nginx для передачи WebSocket соединений дальше по цепочке. Так, все ваши клиенты будут работать с nginx, а не напрямую с вашими другими программами. Сохраняются и используются все достоинства nginx. Не нужно использовать выделенный порт. Не нужно настраивать HTTPS дважды. Не нужно перезапускать какие-то другие программы после обновления сертификатов Let's Encrypt. Настройка делается в четыре строчки: location /mywsapp { proxy_pass http://mywsbackend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } Дальше, нужна альтернатива самостоятельной обработке входящих соединений WebSocket. Такая программа будет брать на себя обработку входящих WS соединений во всей их сложности, оставляя вам лишь обработку входящих сообщений и отправку исходящих. websocketd Например, программа websocketd работает как inetd, только для процессов. При новом соединении запускается ваша программа, которой нужно читать стандартный вход и писать в стандартный выход. Можно не читать, только писать. Пример использования в другом ответе.
Комментариев нет:
Отправить комментарий