CometQL — api работы с комет сервером по протоколу MySQL

от автора


CometQL — это api для работы с комет сервером по протоколу MySQL.

Почему это круто

  • Единый api для более чем 12 языков программирования
  • Простой и понятный вид запросов
  • В php есть средства поддержания постоянных соединений с MySQL и теперь их можно так же использовать для работы с comet сервером.

Например для получения информации о том когда пользователь был online достаточно выполнить следующий запрос:

select id, time from users_time where id = 2; 

А вот запрос для отправки сообщения в канал:

INSERT INTO pipes_messages (name, event, message)VALUES("pipe_name", "event_in_pipe", "text message"); 

Как подключится и попробовать самостоятельно

Вы можете сами подключится с демо данными и попробовать.

# Сервер app.comet-server.ru # Логин 15 # Пароль lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8 # База данных CometQL_v1  # Строка для подключения из консоли mysql -h app.comet-server.ru -u15 -plPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8 -DCometQL_v1 

Для тех кто хочет попробовать подключится но нет под рукой консольного mysql клиента

Вы можете опробовать работу CometQL с помощью online CometQL командной строки (расположена в правом нижнем углу на любой странице)

Общие сведения о CometQL

CometQL внешне представляет из себя некое подобие базы данных. При чём когда мы при подключении выбираем базу данных CometQL_v1 это фактически инструкция указывающая с какой версией api мы хотим взаимодействовать.
Надо понимать что не какого MySQL сервера на бекэнде нет, запросы парсятся и выполняются непосредственно comet сервером. А представление всех возможных действий в виде таблиц и запросов к ним просто удобно и привычно для многих вебмастеров.

Таблица pipes_messages

Таблица pipes_messages содержит сообщения передаваемые через каналы. Для отправки сообщения в канал надо выполнить запрос вставки ( insert ) в эту таблицу.

mysql> insert into pipes_messages (name, event, message)values("pipe_name", "event_in_pipe", "text message"); Query OK, 0 rows affected (0.13 sec) 

Поля «name» и «event» должны соответствовать следующему регулярному выражению [0-9A-z=+/_]
Запрос выборки из pipes_messages вернёт историю сообщений в канале если функция сохранения истории включена для этого канала (о том как эту функцию включить написано ниже).

mysql> select * from pipes_messages where name = "p10"; +------+-------+-------+--------------+ | name | index | event | message      | +------+-------+-------+--------------+ | p10  | 0     | event | msgData      | | p10  | 1     | event | msgqqrrata   | | p10  | 2     | evt3  | msgqqrrata   | +------+-------+-------+--------------+ 3 rows in set (0.00 sec) 

Очищает историю сообщений в канале.

mysql> delete from pipes_messages where name = 'p10'; Query OK, 0 rows affected (0.13 sec) 

Online пример отправки сообщений

Таблица pipes

Таблица pipes содержит информацию о том сколько человек подписались на сообщения из каналов. Таблица доступна только для чтения.

mysql> select * from pipes where name in( "web_admins", "web_php_chat"); +--------------+-------+ | name         | users | +--------------+-------+ | web_admins   | 3     | | web_php_chat | 2     | +--------------+-------+ 2 rows in set (0.30 sec) 

Online пример подписок на каналы

Таблица users_in_pipes

Таблица users_in_pipes содержит данные о том кто из авторизованных пользователей подписался на канал. Таблица доступна только для чтения.

mysql> select * from users_in_pipes where name = "web_admins"; +------------+---------+ | name       | user_id | +------------+---------+ | web_admins | 2       | | web_admins | 4       | | web_admins | 14      | | web_admins | 9       | +------------+---------+ 4 row in set (0.32 sec) 

Примечательно что поле users содержит суммарное количество подписчиков как авторизованных так и не авторизованных в то время как таблица users_in_pipes содержит список только авторизованных подписчиков.

Таблица pipes_settings

Таблица pipes_settings содержит настройки логирования каналов. По умолчанию сообщения проходящие через канал не запоминаются. Но если включить механизм логирования для канала то в комет сервере будет хранится n последних сообщений прошедших через этот канал.
Для включения механизма логирования в канале надо выполнить следующий запрос.

mysql> insert into pipes_settings (name, length) values ('p10', 10); Query OK, 1 row affected (0.00 sec) 

Здесь параметр length это то сколько последних сообщений будет запомнено. Принимает значения от 0 до 99.
Для того чтобы получить значения настроек канала нужно выполнить запрос выборки из pipes_settings.

mysql> select * from pipes_settings where name = 'p10'; +------+--------+ | name | length | +------+--------+ | p10  | 10     | +------+--------+ 1 row in set (0.00 sec) 

Для того чтобы отключить механизм логирования надо удалить из pipes_settings запись настроек.

mysql> delete from  pipes_settings where name = 'p10'; Query OK, 0 rows affected (0.00 sec) 

Механизм авторизации пользователей на комет сервере

Помимо каналов где каждый кто знает имя канала может подписаться на него, есть возможность авторизации пользователей на комет сервере и отправки личных сообщений пользователям по их идентификаторам. Авторизация пользователя происходит в 2 этапа. Первый этап это отправка идентификатора пользователя в вашей системе и случайного хеша в комет сервер.

mysql> INSERT INTO users_auth (id, hash )VALUES (1, 'auth_hash1'); 

  • Здесь строка auth_hash1 — это текстовый ключ авторизации. Вы его сами генерируете на своём сервере и отправляете сначала в комет по средствам insert запроса в таблицу users_auth, а затем передаёте в JavaScript для авторизации конкретного пользователя на комет сервере.
  • id пользователя на вашем сайте, любое целое положительное число не более чем из 9 цифр.

На втором этапе эти сведения (идентификатор пользователя и хеш) надо передать в JavaScript Api

$(document).ready(function() {     CometServer().start({dev_id:1, user_key:"auth_hash1", user_id:"Числовой_Идентификатор_пользователя" }) }); 

Здесь dev_id это публичный идентификатор разработчика.
И теперь пользователь будет авторизован на комет сервере.

Доставка сообщений для авторизованных пользователей

При отправке сообщений авторизованным пользователям по их идентификатору (insert запрос в таблицу users_messages) сообщения доставляются пользователю на все устройства (До 16 устройств) на которых он прошёл авторизацию в данный момент. Это очень удобно в том случаи если человек зашёл на ваш сайт и авторизовался на нём более чем с одного устройства (к примеру телефон и компьютер или просто в двух разных браузерах сидит одновременно).

Если человек в данный момент ofline то сообщение помещается в очередь сообщений и будет доставлено когда человек появится online. В данный момент для каждого пользователя максимальный размер очереди ограничен.

Основное назначение очереди сообщений это доставка сообщений после кратковременного перехода человека в ofline. Например в тех случаях когда человек обновляет страницу сайта на которой было открыто соединение он уходит в ofline примерно на 1 секунду.

Таблица users_messages

Таблица users_messages предназначена для отправки сообщений авторизованным пользователям по их идентификатору.
Например для отправки сообщения пользователю с id = 2 и текстом сообщения ‘message’ надо выполнить следующий запрос

mysql> insert into users_messages (id, event, message)values (2, 'event', 'message'); Query OK, 0 row affected (0.00 sec) 

Сообщение либо отправлено пользователю сразу либо помещено в очередь для отправки пользователю позже.
Для того чтобы получить все те сообщения которые ещё не доставлены пользователю и находятся в очереди надо выполнить запрос select

mysql> select * from users_messages where id = 2; +----+-------+-------+---------+ | id | index | event | message | +----+-------+-------+---------+ | 2  | 0     | evnt1 | message | | 2  | 1     | evnt2 | messag2 | +----+-------+-------+---------+ 2 rows in set (0.00 sec) 

Здесь видно что отправки ожидает 2 сообщения. Они будут отправлены сразу как пользователь появится online.
Таблица содержит колонки:

  • id — Идентификатор пользователя
  • index — Номер сообщения в очереди
  • event — Имя события
  • message — Тело сообщения

Для очистки очереди используйте запрос удаления.

mysql> delete from users_messages where id = 2; Query OK, 0 rows affected (0.08 sec) 

После того как сообщение будет доставлено пользователю оно автоматически удалится из очереди сообщений.

Таблица users_time

Таблица users_time содержит данные о том когда были пользователи online. Таблица доступна только для чтения. Данные о времени хранятся в UNIX-time

mysql> select * from users_time where id in( 2, 3, 145); +-----+------------+ | id  | time       | +-----+------------+ | 2   | 0          | | 3   | 1438245468 | | 145 | -1         | +-----+------------+ 3 rows in set (0.31 sec) 

Здесь пользователь с id = 2 в данный момент на сайте, пользователь с id = 3 был online 30 июля, а для пользователя с id = 145 нет данных.

Таблица users_auth

Таблица users_auth содержит данные для авторизации пользователей на комет сервере.

mysql> insert into users_auth (id, hash )values (12, 'hash1'); Query OK, 1 row affected (0.13 sec) 

mysql> select * from users_auth where id in(2, 3, 12); +----+----------------------------+ | id | hash                       | +----+----------------------------+ | 2  | bjl6knotdb2t1oov958mhuian7 | | 12 | hash1                      | +----+----------------------------+ 2 rows in set (0.32 sec) 

Здесь для пользователя с id = 3 нет данных, а для пользователей 2 и 12 данные присутствуют.

Важно отметить что в поле hash можно передавать только строки длиной не более 32 символов и соответствующие регулярному выражению [0-9A-z=+/_].
Для удаления данных авторизации пользователей используйте запрос delete

delete from users_auth where id = 12; Query OK, 0 rows affected (0.00 sec) 

Советы тем кто делает своё публичное api

Вот, на мой взгляд, 3 наиболее полезные статьи для любого кто собирается делать публичный api интерфейс:

ссылка на оригинал статьи http://habrahabr.ru/post/264425/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *