@viktorross

Как создавать, принимать и обрабатывать socket?

Здравствуйте, хочу сделать чат между авторизованными пользователями, уже установлены на сервер nodejs и websocket, все настроено и через netcat попробовал с двух терминалов вести переписку, но не совсем понимаю как реализовать это на сайте, написан на php и js, есть ли самый простой пример отправки сообщения на сервер и без перезагрузки страницы сразу его отображения у другого человека? Не совсем понятно как это реализовать, и не понятно что именно отправлять порту на котором висит прослушивание, допустим я туда отправляю обычную ссылку с get параметрами в которых содержится user_id от кого и user_id кому, а также ключ сообщения которое хранится в базе данных, дальше как эти данные обработать без перезагрузки, а главное принять и отобразить у того, кому оно предназначено, а не у всех подряд. Как вообще выглядит эта цепочка на примере?
  • Вопрос задан
  • 954 просмотра
Решения вопроса 1
1. Вебсокеты - это сложновато.
2. Вебсокеты на PHP - вдвойне сложно. Проблема в том, что PHP задуман как скриптовый язык, т.е. скрипт выполняется заканчивает свою работу. А вебсокет - это постоянное соединение, т.е нам надо, чтобы программа постоянно крутилась в фоне. Вебсокеты можно реализовать на PHP, но, как персонально мне кажется, проще будет выучить Go )) , или же, как в ответе уважаемого Артём , сделать сервер на ноде.
3. Если ваш чат не такой супер-функциональный, как чат в мессенджерах, то вместо вебсокетов можно обойтись SSE (Server Sent Events). SSE так же требует постоянного соединения, но всё работает через HTTP, и это ну прямо намного проще. Единственный недостаток - это то, что SSE работает только в одну сторону: от сервера в браузер. Т.е. запросы из браузера можно получать обычным POST запросом, а отдавать обратно информацию уже через SSE.

С SSE есть два пути:
1. Написать сервер самому, используя какую-то простую библиотеку вроде этой https://github.com/hhxsv5/php-sse
2. Но я бы сделал ещё проще. Есть такой великолепный проект под названием Mercure https://mercure.rocks
Это отдельный сервис на Go, задача которого как раз поддерживать SSE соединение и отправлять сообщения в браузеры. Сервис сидит в фоне, а браузеры подписываются на события через EventSource буквально в три строчки, как описано тут https://mercure.rocks/docs/getting-started
Прелесть этого в том, что для того, чтобы отправить сообщение всем браузерам из кода на PHP, вам надо просто сделать обычный POST запрос на специальный адрес этого сервиса Mercure с телом самого сообщения и его id. Т.е. вам не надо делать никаких долгоживущих процессов на PHP, всё будет работать как раньше.

Т.е. подытожим:
- Браузеры пользователей подписываются на события в Mercure
- Пользователь 1 отправляет текстовое сообщение обычным POST запросом на обычный PHP сайт.
- PHP сайт получает этот POST запрос, определяет, что его надо отправить Пользователю 2, и отправляет соответствующее сообщение обычным POST запросом в сервис Mercure
- Mercure отправляет сообщение Пользователю 2 через SSE, на которые он подписан.
- Сообщение появляется у него на страничке
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@roxblnfk
На самом деле WS в PHP не так уж и сложны. Можно взять RoadRunner и центрифугу, которые будут менеджить подключения и отправлять запросы в PHP и броадкастить из PHP.
Вот пример на ютубчике: https://www.youtube.com/watch?v=AR9aCQWwXmk

Кроме того, можно запустить PHP в event-loop'е и накодить свою реализацию для вебсокетов. Минимальный набор небольшой: https://github.com/buggregator/trap/tree/master/sr... , но это очень непростой путь и лучше не брать на себя реализацию и поддержку того, что уже реализовано и поддерживается другими.
Так что можно взять за базу swoole (https://habr.com/ru/articles/427589/) или amphp (https://github.com/amphp/websocket-server).

Mercure, как костыль над SSE, я бы не советовал, уж лучше брать сразу полноценный Websocket. Но это вкусовщина.
Ответ написан
Комментировать
@SvizzZzy
Я бы посоветовал использовать фреймворк php Laravel. Там из коробки есть возможность использовать сокеты. Почитайте документацию и посмотрите видео на ютубе: laravel pusher, laravel socket.io и тд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы