Создание WebSocket в yii2

Собирал по кускам из разных статей. Для создания сокетов будет использована технология Ratchet (WebSocket для PHP) и расширенный каркас приложения Yii2 (yii2-advanced).

Понадобится Composer. Yii2 должен был быть развернут именно с его помощью.
1) Нужно добавить в сomposer.json библиотеку Ratchet:

где тильдой обозначен корень проекта.

2) Создать компонент с обработчиком событий сокета в console/components:

3) Создать в console/controllers (или в другом месте, где хранятся контроллеры для консольного приложения) класс:

4) запустить терминал (команды для терминала обозначены как $, сам символ вводить не надо), перейти в корень проекта, ввести:

Терминал перейдёт в режим выполнения задачи и не даст вводить команды, зато сервер готов принимать запросы. Чтобы остановить работу сервера, нужно нажать Ctrl+C, чтобы приостановить, нужно нажать Ctrl+X.

Сервер блокирует выбранный порт (по умолчанию 8080), можно отследить его PID через терминал:

где Номер_порта — число. Для стандартного порта выглядит так:

После этой команды появится PID процесса, который слушает порт. Его можно использовать для снятия задачи:

где PID — число (обычно четырёх-пятизначное)

Чтобы было удобнее, можно запускать в фоновом режиме:

После этой команды PID процесса появляется в терминале сразу.

Клиентская часть (JavaScript):


17 thoughts on “Создание WebSocket в yii2”

  1. Как быть с SessionProvider. Делаю все как надо, но сессия пустая приходит с метода $conn->Session->all()

    1. О какой сессии идёт речь? Если вы про сокет, то при обработке обращения к сокету на сервере сессия недоступна и доступна быть не может. Нужно передавать данные явно (в сокет) либо косвенно (через Redis или базу данных, а сокету отдавая только ID сохраненных данных).

  2. Добрый день! А у вас есть какой-нибудь реальный пример? Мне нужно на странице в режиме реального времени показывать 5 последних записей из БД. Реально сделать при помощи сокетов?

    1. доброго! расскажите больше про вашу задачу: есть ли гарантия, что изменение БД происходит только через ваше приложение? В каком виде должен быть реализован интерфейс отображения последних 5 записей из бд (консоль или веб)? Нужен real-time или допустима задержка?

      1. Да, изменение БД происходит только через приложение. Интерфейс отображения должен быть реализован через веб и необходим именно real-time.
        Т.е. у меня на странице, среди прочей информации, есть блок в виде таблицы «Трансляция ставок аукциона», где отображаются последние 5 ставок аукциона. И в любую секунду можно сделать ставку, которая должна отобразиться в этой табличке (т.е. ставка станет первой строкой в таблице). Ставку ставят на этой же странице (но это уже не суть).

        1. тогда вам есть смысл делать это не подвязываясь к БД, а сделав что-то вроде общего чата, где вместо сообщений будут ставки, тогда как сохранение в БД реализовать наподобие логирования, когда «сообщение» приходит на сервер Ratchet. Потому что задача считывания последних записей в БД realtime гораздо сложнее.
          Если все ещё нужен код, укажите вашу рабочую почту, я вышлю вам пример.

          1. пришлите пожалуйста пример считывания базы в реал тайм

    1. Ого! Вообще над безопасностью надо поработать…
      //test
      alert(«Надо поработать над безопасностью»);

  3. А можно ли сделать приватный чат допустим из двух — трёх юзеров? Делать под каждого отдельную страницу не выгодно, а как тогда поступить? Кто-нибудь делал?

    1. Если речь идёт о сокетах, вы можете с клиента передавать айди чата, в котором участвует пользователь — и сервер сам сможет определить, на какие сообщения для какого чата вас подписывать.

  4. Данный пример работает, но хотелось бы понять многопоточность и однопоточность в PHP.
    Спасибо за статью!

  5. У меня сервер перестает принимать сообщения где после 2 часов работы. Как этого можно избежать?

    1. Вам нужно выяснить, в чем причина падения сервера. Если не хотите заморачиваться, то пользуйтесь менеджером процессов.
      В nodejs используется pm2, в php часто используют supervisor. Эти службы помогают поднимать снова упавший процесс, и прием сообщений не прекращается.

  6. Супер!
    Спасибо, все получилось!!!

    стрелочки > в коде преобразовались в такой вид >. Поправьте, а то может кто-то и в тупик сядет)

Добавить комментарий для decadal Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *