Создаю чат. WebSocket.

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Создаю чат. WebSocket.

Сообщение girmate »

vitalik1183 писал(а): а что вы боитесь этого? через пол года скилл прокачается, будете на это смотреть как на отправку форм)
Я не боюсь. Я за последний год столько информации усвоил и новых вещей, что просто не влазит в меня уже, пока не переварю и не буду на это смотреть как на пройтись в цикле по массивчику.
Осторожно! Вы общаетесь с новичком ;)

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Создаю чат. WebSocket.

Сообщение zelenin »

для чего неткат-то нужен в контексте вебсокетов?

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Создаю чат. WebSocket.

Сообщение girmate »

Все, доигрался. Сломались ваши сокеты. Думал, что ошибку в коде допустил и не вернул на место, но скачал оригинал и все тоже самое: при закрытии одного из окном с чатом в другом чате пишет null:null. Сегодня точно не мой день.
Осторожно! Вы общаетесь с новичком ;)

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: Создаю чат. WebSocket.

Сообщение vitalik1183 »

zelenin писал(а):для чего неткат-то нужен в контексте вебсокетов?
да ни для чего, это я вапще про азы говорил.
Yii2!

sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Создаю чат. WebSocket.

Сообщение sda »

Тебе просто нужно принимать от сокета сообщение в определенном формате, также как yii принимает сообщение в http формате. Дальше парсить это сообщение и роутить к нужному контроллеру и экшену. Например клиент может присылать такое сообщение на аутентификацию {"action": "user.login", "params": {"email": "admin@domain.com", "password": "qwerty"}}. Сервер его принимает, парсит, понимает что ему нужен UserController и экшен login, вызывает этот экшен с параметрами от клиента, если юзер найден, то записываем сокет-подключение в массив аутентифицированных подключений по userId. Типа $authClients[$user->id] = $conn;

Далее, чтобы отправить конкретному юзеру месседж, делаем $authClients[$user->id]->send($msg); Вся эта логика должна начинаться в эвенте onMessage если мы говорим про Ratchet.

По-сути по хорошему поверх Ratchet нужно написать свой вебсокет фреймворк. Который будет обмениваться данными с клиентом определенном формате, например в JSON-RPC или выдумать собственный протокол обмена данными (не рекомендую). Дальше все тоже самое, как в yii и других фреймворках, парсим сообщение, вызываем контроллер, экшен и отправляем результат нужным клиентам.

sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Создаю чат. WebSocket.

Сообщение sda »

Кстати Ratchet написан на асинхронной платформе Reactphp, который является клоном node.js, но это всё в дико зачаточном состоянии. Нет инфраструктуры вокруг всего этого, нет асинхроных библиотек для работы с базами данных/файловой системой и т.д. и т.п. То есть написать большое полноценное (не хелоу ворлд) асинхронное реалтайм приложение в таких спартанских условиях почти невозможно. Вместо этого ты застрянешь в написании всяких низкоуровневых асинхронных библиотек для работы с ФС и прочим.

Или форкать дочерние процессы и когда приходит сообщение от сокета закидывать его в дочерний процесс и там обрабатывать в привычном синхронном режиме. Но это всё медленно, криво, нет потоков из коробки, нужно придумывать всякие костыли для общения родительского и дочерних процессов. В общем ситуация такая, что проще забить, выучить и сделать на node.js. Ты сейчас не найдешь на php ни одного реалтайм проекта работающего по вебсокету, потому что сейчас это реально ад такое на нем делать.

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Создаю чат. WebSocket.

Сообщение girmate »

Спасибо за познавательную развернутую инфу. В сторону Ratchet пока не смотрю, хочу немного разобраться сам с этим протоколом.
Я не понимаю, для чего мне нужно переходить на Node.js всего лишь из какого-то чата виджета на моих страницах, который будет играть просто вспомогательную роль (оживить проект). Ну и немного - возможность отправить личное сообщение. На этом его функции заканчиваются.

По поводу подключения пользователей к чату. Я думал сделать немного по-другому. Если пользователь не залогинен - я ему скидываю слово guest в скрытое поле и он просто может получать сообщения в чат, но не сможет ничего отправить (заблокирую/спрячу кнопки, буду сообщать об ошибке при попытке отослать сообщение другими способами, в обход логики клиентского скрипта). Если он залогинен - скидываю ему в тоже самое скрытое поле некий токен, который ему принадлежит (из таблицы USER). Далее при попытке подключится ищу пользователя с таким токеном, если найден - подключаю как аутентифицированного, известного пользователя с конкретным именем. И заодно знаю кому слать сообщения если придет личное сообщение. Если токен не найден - подключаю как гостя. Подключить я его должен в любом случае, чтобы любой мог "смотреть в чат".

to zelenin:
Александр, хочу узнать ваше мнение по поводу моей схемы авторизации в чате.
Осторожно! Вы общаетесь с новичком ;)

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Создаю чат. WebSocket.

Сообщение girmate »

И второй, насущный вопрос. А сколько памяти будет потреблять один процесс? Ведь на каждой странице будет висеть чат-виджет. В среднем пользователь захочет три страницы держать открытыми - уже три подключения. Пусть пользователей будет одновременно 200 чел. в пик посещаемости. Итого 200*3 = 600 подключений. А справиться ли сервушка? Хостеру написал тот же вопрос. Его ответ - на вашем тарифном плане выделено столько-то памяти, незнаю сколько 1 подключение потянет, но более 50% от этого объема памяти занимать не рекомендуется. Вот так вот. У кого был опыт использования вебсокетов совместно с сервером на PHP? Сколько это дело выдерживало подключений и какого типа тариф был у вас: shared-хостинг, VPS или выделенный сервер? Может я зря влез в эти сокеты? Повсюду на форумах пишут кидайте это дело с PHP и пишите на Node.js.
Осторожно! Вы общаетесь с новичком ;)

andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Создаю чат. WebSocket.

Сообщение andrei.obuhovski »

Ну так и гляньте node.js, чего к php привязались. Js то вы уже немного знаете.

Тем более у ноды в сравнении с пхп куча преимуществ:
1) асинхронность и соответственно скорость
2) один язык на сервере и клиенте
3) легче писать реалтаймовые и консольные приложения
Минусы:
1) Немного выше порог входа.
2) Нужно следить за памятью. (но в демонах на php тоже придется следить)
3) Технология только развивается. Поэтому крупных фреймворков еще нет.

sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Создаю чат. WebSocket.

Сообщение sda »

Преждевременная оптимизация зло. Нужно думать не о том, на сколько хватит памяти, а о том, как спроектировать приложение так, чтобы оно масштабировалось на 2 и более сервера. Когда уже реально будет течь память, тогда и разбираться в чем проблема и думать как исправить. Иначе никогда не выкатите ничего в продакшн. Можно годами сидеть оптимизировать.
В сторону Ratchet пока не смотрю, хочу немного разобраться сам с этим протоколом
Ок. Тогда вам нужно самостоятельно реализовать RFC6455. Вы реально оцениваете свои возможности? Я её читал и я бы не взялся, помимо того, что нужно скурпулезно разобраться в каждой мелочи и реализовать это всё в коде, нужно будет еще и думать об различных багах вроде переполнения буфера, когда присылают огромное сообщение и сервер валится. Даже в годами существующих решениях, с огромным сообществом постоянно находят какие-то такие уязвимости.

Давайте так, вы же не пишите свой HTTP-сервер по RFC2616. Я уверен, что вы её не читали вообще. Вы берете уже что-то готовое вроде nginx/apache и используете. Тоже самое с вебсокет-сервером. Будьте реалистом. Никто не пишет это с нуля.

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Создаю чат. WebSocket.

Сообщение girmate »

На счет преждевременной оптимизации я в курсе. Верное утверждение.

Зачем мне реализовывать протокол, если для этого уже используются готовые функции для работы с сокетами? Вы видите код на второй странице viewtopic.php?f=4&t=40088&start=20#p202070? Это уже готовый чат. Мне нужно лишь добавить поддержку личных сообщений и еще немного вещей. Я думаю, что рано или поздно справлюсь. Зачем мне целая библиотека в данном случае?
Осторожно! Вы общаетесь с новичком ;)

sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Создаю чат. WebSocket.

Сообщение sda »

Потому, что Ratchet делает тоже самое, но использует более правильный подход. Ваш код перемешивает бизнес-логику приложения, с реализацией протокола. Код сделан на коленке. Вам также нужно помнить, что любой синхронный input/output будет блокировать скрипт, т.е. пока один запрос обрабатывается, все остальные повиснут и будут ждать. Но дело ваше, делайте как считаете нужным.

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Создаю чат. WebSocket.

Сообщение girmate »

Ну вот теперь более менее понятно. Скажите, этому Ratchet - что ему нужно дополнительно? У меня обычный shared-хостинг. И внутри него уже все готовое, дополнительных компонентов/модулей не нужно?
Осторожно! Вы общаетесь с новичком ;)

andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Создаю чат. WebSocket.

Сообщение andrei.obuhovski »

girmate писал(а):У меня обычный shared-хостинг.
VDS же копейки стоят. Чем обусловлен выбор шаред хостинга?

sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Создаю чат. WebSocket.

Сообщение sda »

Ну а вы сможете на шареде запускать своих демонов из консоли? Я думаю врядли. Кроме того, вам же нужно еще какое-то ПО ставить или настраивать операционную систему, чтобы следить за вашими демонами и рестартить их автоматически, когда они крашатся или из-за утечек съедают всю память.

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Создаю чат. WebSocket.

Сообщение girmate »

Выбор обычного хостинга обусловлен тем, что проект стартующий и вкладывать деньги в ресурсы не имеет смысла при запуске. Не пойму зачем Вы про каких-то демонов говорите). Я думаю, что скрипт (серверная часть) должна запускаться кроном по расписанию. Пока думаю - логика такова: каждую минуту запускается небольшой скрипт который проверяет запущен ли сервер и если не запущен, то запускать его. Вот только не пойму - ведь скрипт должен из консоли запускаться. Я смогу кроном его запустить или это разные вещи?

Да, я понимаю, что нужен как минимум VDS(VPS) или выделенный сервер. Но самая большая проблема я никогда не администрировал и не настраивал сервера. Так что дело даже не в деньгах а в моих возможностях. Но если это реально будет необходимо, то да, придется брать VDS и платить за первую настройку и первичное администрирование.

Не первый раз слышу про демонов. Что это такое, в двух словах? Он стартует сразу с запуском сервера? Если да, то это вариант конечно же. Но на моем хостинге есть доступ через SSH, однако я не разу с этим не работал.
Осторожно! Вы общаетесь с новичком ;)

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Создаю чат. WebSocket.

Сообщение girmate »

girmate писал(а):Спасибо за познавательную развернутую инфу. В сторону Ratchet пока не смотрю, хочу немного разобраться сам с этим протоколом.
Я не понимаю, для чего мне нужно переходить на Node.js всего лишь из какого-то чата виджета на моих страницах, который будет играть просто вспомогательную роль (оживить проект). Ну и немного - возможность отправить личное сообщение. На этом его функции заканчиваются.

По поводу подключения пользователей к чату. Я думал сделать немного по-другому. Если пользователь не залогинен - я ему скидываю слово guest в скрытое поле и он просто может получать сообщения в чат, но не сможет ничего отправить (заблокирую/спрячу кнопки, буду сообщать об ошибке при попытке отослать сообщение другими способами, в обход логики клиентского скрипта). Если он залогинен - скидываю ему в тоже самое скрытое поле некий токен, который ему принадлежит (из таблицы USER). Далее при попытке подключится ищу пользователя с таким токеном, если найден - подключаю как аутентифицированного, известного пользователя с конкретным именем. И заодно знаю кому слать сообщения если придет личное сообщение. Если токен не найден - подключаю как гостя. Подключить я его должен в любом случае, чтобы любой мог "смотреть в чат".

to zelenin:
Александр, хочу узнать ваше мнение по поводу моей схемы авторизации в чате.
Сам себе отвечу. Мне кажется авторизация и общение с чатом не так должно происходить.

Когда пользователь загружает страницу, то в скрытые поля следует скидывать его username и id и также соединить это все вместе и захешировать через секьюрити методы. Серверный скрипт получает от пользователя его имя, id и сравнивает с хешем, убеждаясь, что клиент подлинный. Так мы убьем сразу двух зайцев:
а) не нужно будет обращаться к БД, клиент сам предоставит информацию о себе
б) мы сразу получаем данные клиента, чтобы отличать одного пользователя от другого. Это пригодится для отправки личных сообщений.
возможные минусы:
а) не может ли так случиться, что кто-то попросит показать данные в скрытых полях другого пользователя и тогда, подставив их, сможет спокойно читать его личные сообщения. Но ведь и с токеном такая же ситуация. Если его скидывать, а потом искать в БД по токену юзера. Или это уже паранойя и на раннем этапе об этом не стоит думать, до развития проекта? Хотя чат загрузится сразу вместе страницейи тут же постучится к серверу на коннект и на этом шаге что-то подменить, наверное, не получится. Плюс IP пользователя можно еще проверять. Если IP при подключении отличается при последующих запросах, то отлонять их. Короче, нужно думать. Но хотелось бы не дергать БД каждый раз, когда пользователь присылает сообщение.
Может есть какой-то еще механизм, простой и надежный? Цель - отличить одного пользователя от другого.
Осторожно! Вы общаетесь с новичком ;)

andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Создаю чат. WebSocket.

Сообщение andrei.obuhovski »

Но самая большая проблема я никогда не администрировал и не настраивал сервера. Так что дело даже не в деньгах а в моих возможностя.
Под ваши цели хватит VDS за 1$.
А вы пробовали настраивать? Что конкретно не получилось?

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Создаю чат. WebSocket.

Сообщение girmate »

andrei.obuhovski писал(а):
Но самая большая проблема я никогда не администрировал и не настраивал сервера. Так что дело даже не в деньгах а в моих возможностях.
Под ваши цели хватит VDS за 1$.
А вы пробовали настраивать? Что конкретно не получилось?
Как я боялся этого вопроса))) Нет не пробовал. На шаред хостинге все просто - все делается на странице браузера (и почтовые ящики создаются и БД и модули PHP можно включать - отключать. Да много чего!). Но когда мне говорят, что нужно с командной строкой поработать - тут я пас. Я незнаю ни одной команды. Я не имел опыта работы с линуксами и так далее. И вы уже не первый, кто об этом намекает: мол, пора. Видимо, придется туда влезть. Цена вопроса 5 или 20 долларов для меня не критично. С чего начать (под мою задачу)? VDS?
Осторожно! Вы общаетесь с новичком ;)

andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Создаю чат. WebSocket.

Сообщение andrei.obuhovski »

VPS и VDS это одно и то же. Возьмите бесплатно на тестирование и потренируйтесь.
Ничего там сложного нет. Все уже давно описано по шагам.

Ответить