За последние 24 часа нас посетили 17753 программиста и 1922 робота. Сейчас ищут 978 программистов ...

WebSokects в PHP для чайников

Тема в разделе "PHP для новичков", создана пользователем glorsh66, 15 сен 2018.

  1. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Хочу прикрутить к существующему проекту написанному на PHP веб сокеты для чата и для обновления инфы о колличестве новых сообщений и таких мелочей.
    Хочу использовать пых для того что бы использовать уже написанную логику приложения (типа как добавлять

    Подскажите правильно ли я понимаю -
    1) Веб сокет должен крутить на отдельном демоне. В нем Веб сервер никак не учавствует. Т.е. жрет память только пых.
    2) Первый запрос это обычный GET/POST и уже потом он апгредится до WEBSOKET и висит уже так до закрытия вкладки браузера.
    2.1.) Правильно ли я понимаю - что в момент установления коннекта в headere передатся cookies и session - т.е. можно определить что за пользователь подключился. Ведь если мы установили соединение с правильным юзером - это соединение можно считать безопасным?
    2.2.) Или обязательно в каждом запросе нужно слать - token_ID
    3) Как обычно реализуется (нужно обновлять конкретную переписку, и нужно обновлять общее число новых сообщений) - делается два демона, каждый для конкретной задачи? Или просто в сообщениях пишется заголовок?
    4) Самый наверное важный вопрос - как с блокировками в PHP.
    Насколько я понял сам процесс работы вебсокетов должен крутиться в бесконечном цикле.
    Но в тот момент пока скрипт выполняет блокирующую операцию (например добавляет что то в базу или файл) стучится еще один пользователь. Что происходит? Пользователь просто не получает ответа?
    5) Как можно вычислять уже закрытые соедение и их удалять?

    Что лучше выбрать -
    phpdaemon
    Ratchet
    Workerman или что то менее известное и лайтовое?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.593
    Симпатии:
    1.764
    Лично я использую centrifugo как сервер веб-сокетов (потому что оно элементарно поднимается на любом сервере), и использую, когда мне надо передать что-то с сервера на клиент. С клиента на сервер передаю обычным post/get. По поводу блокировок - должна быть очень большая нагрузка, чтобы встроенные в базу механизмы не справились.

    Использую centrifugo, чтобы не заморачиваться с логикой работы с сокетами.
     
    Алекс8 и glorsh66 нравится это.
  3. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    А как авторизация делается?
    Клитент запрашивает соедение - на сервере добавляется в массив (ну или иную структура данных) его ID (если у него открыта сессия) и это соединие соотносится с ID какогото пользователя?
    Соедение висит открытым. До конца работы.
     
  4. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    послушаю ответы... а то мне надо делать сейчас комнату для вебинаров.. чат на сокетах, всякие всплывающие сообщения в реальном времени от ведущего курса... хз пока как делать)) пока жду музу))
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.593
    Симпатии:
    1.764
    @glorsh66, там есть приватные каналы.
     
  6. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Лично я фанат классики socket.io redis php. Еще мне нравится swoole но я до конца не разбирался. Вообще node понемногу все на себя забирает сокеты крон менеджер процессов сервисы мониторинг. Удобно. Еще немного и от остальных языков откажусь а то прям везде костыли.
     
    glorsh66 нравится это.
  7. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    А REDIS тут как временное хранилище просто? Типа что бы по 10 раз в базу не лезть?
     
  8. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    У редиса есть pubsub https://redis.io/topics/pubsub на который node может подписаться нам ведь нужен риалтайм
    --- Добавлено ---
    А вообще нужно переходить на фреймворки в той же ларке есть laravel-echo-server авторизация на бродкасты очереди горизонт для мониторинга практически все с коробки
     
  9. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    как раз сегодня ларавел ковырял)) первый раз)) капец... какой то он странный по сравнению с yii2))
     
  10. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @Алекс8 Начни с документации. Там много классных вещей написано и о фреймворке и о жизни в целом) Просто немного по другом. Так везде.
     
    Алекс8 нравится это.
  11. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    да я давно хочу с ним познакомится)) но все время нет)) всегда что то надо делать срочно и быстро)) поэтому делаю с тем что знаю)) но оочень хочется его освоить)) сейчас вот надо кое что сделать - хотел взять Люмен)) но что то блин не то.. жалею что у Yii2 нет микро версии его))
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.593
    Симпатии:
    1.764
  13. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @Алекс8 ты только смотри оригинальную доку. Даже с переводом через гугл она лучше всяких su ru.
    А вот это не правда. В yii просто все по умолчанию отключено.
    Даешь реальные тесты одинаковых проектов после оптимизации и деплоя?
    Плюс есть swoole. И даже так https://github.com/swooletw/laravel-swoole
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.593
    Симпатии:
    1.764
    В Yii просто вместо тонны сервис-провайдеров один массив. Может с точки зрения канонов ООП оно и хуже, зато считать один файл быстрее, чем лазить по вендору, грузить сервис-провайдеры. Может, коненчо, я чего не умею, но у меня разогнать Laravel не получалось до цифр, которые даёт Yii2. А уж в с включённой отладкой так Laravel в разы медленнее, чем Yii2 (тоже с включённой отладкой)
     
  15. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @mkramer Я вот как раз писал сообщения за отладку) Она ужас какая прожерливая.. Просто в основном люди тестируют то что есть с коробки вот у них и получается x2 а на самом деле разница не такая большая.
    --- Добавлено ---
    Плюс это только пых. На нем нагрузка минимальная. Все эти очереди сокеты редисы базы и т.д вот о чем нужно волноваться.
     
  16. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Я поднимаю тему после "небольшого" перерыва. Начал разбираться - и не могу понять как можно определить какой конкретно пользователь подключился - ведь при подключении к веб сокету не передаются куки - соответсвенно сессия тоже неизвеста?

    Как лучше всего с этим обойтись?? Генерировать случайное скрытое поле для каждого раза когда пользователь открывает - Открыть чат?
     
  17. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я не стал особо заморачиваться)) человек проходит аутентификацию - в куках есть есть ID сессии... в момент аутентификации я в таблицу chat_users добавлю запись с его ником, номером комнаты и ИД сессии..
    после аутентификации мы соединяемся с сокет сервером и отпряем ему ID комнаты, ID пользователя и его сессию, если все это совпало - тогда мы устанавливаем с ним соединение..
    ну а отправка ему сообщений уже не проблема.... ведь в базе написано в какой он комнате находится с какой ID сессией и набором прав)