Некоторое время назад, а именно седьмого марта этого года, мне в голову пришла идея: «А что если сделать сервис, позволяющий любому пользователю интернета создать собственный чат, и даже не один?». Конечно, в период всеобщего помешательства на чатах, еще до web 2.0, такие сервисы были. Они есть и сейчас, но это все иностранные разработки, ориентированные на сегмент знакомств, и развлечения для взрослых.
Моя же идея заключалась в том, чтобы дать пользователю возможность оперировать чатами как группами в социальной сети. Фактически, каждый созданный чат должен выполнять функции площадки для общения в рамках сообщества, творческой группы, офиса и просто объединенных общими интересами людей. Страницы должны быть минималистичными, интерфейс — простым и интуитивным.
Вечером того же дня я набросал схематичный дизайн на бумаге, и начал писать код.
Вот уже семь, или восемь лет в своих разработках я использую собственный движок на php + mysql, который год от года, проект за проектом, модифицируется и совершенствуется. В нем реализованы такие вещи как регистрация, авторизация и идентификация пользователя (класс User), класс работы с базой данных, работа с почтой, поддержка локализаций (многоязычность), и прочие вещи, позволяющие быстро начать разработку чего-то нового.
Самым интересным и новым для меня этапом разработки стало решение проблемы отправки и получения сообщений, организация каналов и работа с ними.
Было понятно, что тут не обойтись без comet-сервера. Сам я с этой технологией до этого никогда не сталкивался, как и с сокетами вобще, так что некоторое время ушло на чтение статей и изучение матчасти. В итоге, почитав про различные возможные варианты реализации comet-сервера и про их подводные камни, я пришел к выводу, что с наскоку эту проблему мне не решить, и стал искать готовые решения.
Так получилось, что благодаря Хабру, я узнал о Realplexor'e (далее РП), разработке отечественной компании dkLab.
Эта технология меня полностью устроила, и я решил, что именно РП будет отвечать за самую главную часть функционала моего сервиса.
Тут же возникла новая проблема — моего обычного веб-хостинга стало мало. Для РП нужен отдельный сервер, с полным доступом.
Сразу скажу, что в unix linux, как и в настройке серверов, я ни в зуб ногой. Поэтому сервер для меня стал действительно проблемой.
Я обратился к своему другу, Александру, который сразу предложил свой сервер, арендованный у Hetzner.
Перекинули код, Александр поставил РП, и я взялся за интеграцию РП в свой движок. Когда базовый функционал отправки получения сообщений был готов, всплыла очередная проблема: при открытии одного и того же канала более чем у пяти клиентов (или даже просто в пяти разных вкладках одного браузера), РП отваливался. Сообщения переставали отправляться и, соответственно, приходить. Это выглядело как будто связь с сервером пропадает. Страница загружена, поток сообщений идет, и вдруг (к каналу присоединился очередной клиент), сообщеня перестают приходить.
Убив два, или три дня, и так и не разобравшись с проблемой, я отложил ее «на потом», и пошел дальше по списку задач.
Являясь перфекционистом, меня не могло не смущать, что DNS — названия серверов, к которым был привязан домен проекта, не соответствовали названию домена.
Да и лишние папки на сервере меня, признаюсь, раздражают. Так было принято решение о переносе проекта на отдельный сервер, аналогичный предыдущему.
И тут случилось чудо — РП перестал подвисать. Методом сравнения изменений в коде я выяснил, что причина была в строке создания объекта РП: $rp = new Dklab_Realplexor("127.0.0.1", "10010", "prefix_");
На предыдущем сервере я указал «localhost» вместо «127.0.0.1», что и оказалось критичным местом (хотя у меня есть сомнения на этот счет, но других вариантов у меня нет).
Ну а дальше понеслось — эксперименты с дизайном, поиск наиболее удобного расположения элементов интерфейса, программирование важных функций, и различных «фишечек».
Сейчас весь проект работает на php + mysql (а также jqery + js + css). MySQL был оставлен на период публичного тестирования и обкатки, чтобы исключить звено базы данных в случае возникновения непонятных багов. Позднее планируется заменить его на Mongodb.
В планах:
— мобильная версия;
— функции администрирования (возможность выкидывать и банить вредных пользователей вашего чата, назначать др. пользователей админами);
— реализация независимых каналов, куда будут транслироваться сообщения с тегами #название_канала;
— embed-поведение для вставки чатов на другие сайты;
— публичное API для автоматизации работы с чатами (например, создание и вставка чата под каждой статьей на вашем сайте в качестве системы комментирования);
— мобильное приложение для iOS и Android.
Благодарности:
Александру Вопиловскому trapholov за помощь с серверной стороной, теперь нас в проекте двое, а это — уже команда.
Дмитрию Котерову DmitryKoterov за Realplexor, и помощь в паре вопросов по нему.
Хабрачат — канал для Хабратестеров
Мой профиль на Onechat (несколько каналов)
Onechat Вконтакте
Автор: SirD