Не знаю, поможет или нет, но я бы начинал поиск с готовых решений:
Для бэкендаДля фронтэнда
В качестве библиотеки, реализующей вэб-сокеты используется
Ratchet
Полагаю, что для PHP надо будет ещё посношаться с настройкой деплоймента, хотя не факт. Получается, что у нас будет два типа сообщений:
1. Состояние списка пользователей.
2. Сообщения пользователей.
Если бы речь шла об ангуляре, то можно было бы отслеживать фокус на input, либо изменения модели, привязанной к input. Либо, можно было бы усложнить процесс и изучать кол-во изменений модели за единицу времени. Есть ещё возможность отлавливать keypress. В общем, когда мы устанавливаем, что current client печатает, мы отправляем на сервер сообщение одного типа. Если пользователь производит submit - сообщение другого типа.
Так мы можем использовать Redis / RabbitMQ сервер для сохранения статусов пользователей открытых бесед (и удалять instance, если беседа закрыта). Получается следующая схема:
В ОЗУ хранится {'dialogIDqweqweqwe': {'users': {'vasya': {'state': 'online', 'activity': 'printing'}, 'petya': {'state': 'online', 'activity': null'}} ]}}
При изменении статуса от Пети, его клиент отправляет {'action': 'userActivity', 'value':'printing'}. Насколько я понял доку по рэтчету, когда приходит сообщение от одного из клиентов, срабатывает хук onMessage. В нём мы проверяем action ответа и, либо сохраняем данные и делаем $client->send (если что-то изменилось в сравнении с предыдущим состоянием), либо игнорируем изменения.
Механизм web-сокетов вы понимаете правильно. На бэкенде поднимается server - приложение, которое реализует протокол
WebSocket. Общее представление о работе даёт его название. Server представляет собой сокет, к которому подключается N клиентов и слушают изменения (ждут событий).