Задать вопрос

Как сделать чат на Memcache?

Немного изучаю PHP.
Подскажите плиз, правильно ли делаю или нет.


Задача: Написать тет-а-тет Чат ,аналог личных сообщений в ВК но сессий у них может быть открыто много, нет привязок к логину, будем считать что это анонимный чат
-история сообщений не нужна, нужно хранить сообщения в оперативной памяти(новые сообщения) и периодически подгружать в DOM к пользователю.
Закрыл барузер = сообщения потерялись.
Как такой написать на Mysql + php знаю, но как это дело ускорить с помощью хранения в оперативной памяти?
Мой алгоритм:
0) как я понял, работать мы можем только в 1 столбце, так что придется извращаться с JSON форматами
1) Допустим у нас есть 4 пользователя, у каждого из них есть уникальный хеш в виде ключа и напротив него некий массив данных и сообщений, которые хранятся в Memcache:
User_vasya_5ebf8364d17c8df7e4afd586c24f84a0 => 'null'
User_masha_8135a52f656cf46181ed78da134de84 => 'null'
User_zhenya_1f124cf46181ed78da13423111 => 'null'
User_rita_2131cf46181ed78da13423111 => 'null'
2) Если ваcя захотел пообщаться с машей , то он отправил ей сообщение , тем самым поменял ее значение в БД, теперь база данных выглядит так:
User_vasya_5ebf8364d17c8df7e4afd586c24f84a0 => 'null'
User_masha_8135a52f656cf46181ed78da134de84 => 'тут многомерный массив новых сообщений JSON"

что-то в стиле:
{
"User_vasya_5ebf8364d17c8df7e4afd586c24f84a0": "Привет",
"User_vasya_5ebf8364d17c8df7e4afd586c24f84a0": "Как дела?",
"User_vasya_5ebf8364d17c8df7e4afd586c24f84a0": "Ты откуда?",
}


2.1) женя тоже решил отправить маше сообщение,теперь ее массив выглядит так:
{
"User_vasya_5ebf8364d17c8df7e4afd586c24f84a0": "Привет",
"User_vasya_5ebf8364d17c8df7e4afd586c24f84a0": "Как дела?",
"User_vasya_5ebf8364d17c8df7e4afd586c24f84a0": "Ты откуда?",
"User_zhenya_1f124cf46181ed78da13423111 ": "Привет, а я женя",
}


3) Маша стучится каждую секунду в свою строчку в Memcache через AJAX и проверяет, есть ли там что-нибудь новенькое, если есть, то выкачивает, распаковывает, внедряет в DOM и отчищает свой Memcache

Вопросы:
1)Очень большая вероятность что маша отправит запрос на удаление("я добавила к себе в DOM, можно отчищать массив, нефиг ему разростаться, он же тупо для буфера"), именно в тот момент когда вася пришлет ей новое сообщение. Как сделать проверку?
Подскажите плиз как лучше такое реализовать.
  • Вопрос задан
  • 306 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
atlantech
@atlantech
Full Stack Software Developer
Если вам не нужно сохранять сообщения - то и хранилище не требуется. Вы сможете обойтись средствами вашего ЯП.

Рекомендую воспользоваться WebSocket протоколом. Реализовать это можно на большинстве ЯП. Если вы хотите сделать это именно на PHP то смотрите в сторону phpDaemon или reactphp. Вам достаточно будет запрограммировать скрипт, который будет принимать соединения и прослушивать отправку сообщений с клиента, затем вы сможете сохранить сообщение в общий массив (что по факту и будет хранением в памяти) и раздавать в сокеты другим пользователям. Все сообщения потеряются с заверщением работы скрипта.

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

Почитайте больше статей в интернетах по этому поводу, например www.sitepoint.com/how-to-quickly-build-a-chat-app-...
Ответ написан
Ваш ответ на вопрос

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

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