CometQL - это api для работы с комет сервером по протоколу MySQL.
Преимущества CometQL
В данном представлении данные лежат в таблицах а команды на выборку или вставку совершают какие-то действия. Например, для получения информации о том, когда пользователь был online достаточно выполнить следующий запрос:
SELECT * FROM users_time WHERE id = 2;
Вот что мы увидим
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 нет данных.
Вы можете сами подключится с демо данными и попробовать. Но подключатся рекомендуется через консоль, так как не все графические MySQL клиенты нормально работают с comet сервером.
# Сервер app.comet-server.ru # Логин 15 # Пароль lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8 # База данных CometQL_v1 # Строка для подключения из консоли mysql -h app.comet-server.ru -u15 -plPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8 -DCometQL_v1 --skip-ssl
Или ещё можете использовать онлайн командную строку. Она расположена в правом нижнем углу экрана на всех старицах.
Пример подключения к комет серверу из php.
$dev_id = "15"; // Используется как логин $dev_key = "lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8"; // Используется как пароль // Подключение выглядит как будто мы подключились к бд. Можно использовать функции для работы с mysql // Но на самом деле вы подключаетесь к комет серверу. $link = mysqli_connect("app.comet-server.ru", $dev_id, $dev_key, "CometQL_v1"); if(!$link) { die("Не удалось создать соединение c CometQL"); } $result = mysqli_query ( $link, "show status" ); if(mysqli_errno($link) != 0) { echo "Error code:<a href='https://comet-server.com/wiki/doku.php/comet:cometql:error' target='_blank' >".mysqli_errno($link)."</a>"; echo "Error text:<a href='https://comet-server.com/wiki/doku.php/comet:cometql:error' target='_blank' >".mysqli_error($link)."</a>"; exit; } while($row = mysqli_fetch_assoc($result)) { echo "<pre>"; var_dump($row); echo "</pre><br>"; }
Замечания по реализации текущей версии CometQL:
Таблица 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=+/_]{3,64}$
Запрос выборки из 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)
Введите имя канала «pipe_name» и нажмите подписаться. А теперь с помощью online командной строки расположенной в углу экрана выполните запрос вставки в pipes_messages и увидите что сообщение дошло.
mysql> INSERT INTO pipes_messages (name, event, message)VALUES("pipe_name", "event_in_pipe", "text message");
Таблица pipes содержит информацию о том сколько человек подписались на сообщения из каналов. Таблица доступна только для чтения.
mysql> SELECT * FROM pipes WHERE name IN( "web_admins", "web_php_chat"); +--------------+-------+ | name | users | +--------------+-------+ | web_admins | 0 | | web_php_chat | 0 | +--------------+-------+ 2 ROWS IN SET (0.30 sec)
Выполните запрос
mysql> SELECT * FROM pipes WHERE name IN( "web_admins", "web_php_chat");
Теперь введите имя канала «web_admins» и нажмите подписаться. А теперь выполните запрос ещё раз и увидите что подписчиков в канале стало больше.
Таблица users_in_pipes содержит данные о том кто из пользователей подписался на канал. Таблица доступна только для чтения.
mysql> SELECT * FROM users_in_pipes WHERE name = "web_admins"; +------------+---------+-----------+-----------------+-------------------------------------+ | name | user_id | ip | origin | LANGUAGE | +------------+---------+-----------+-----------------+-------------------------------------+ | web_admins | 0 | 127.0.0.1 | https://site.ru | ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 | | web_admins | 364 | 127.0.0.1 | https://site.ru | ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 | +------------+---------+-----------+-----------------+-------------------------------------+ 4 ROW IN SET (0.32 sec)
Таблица имеет следующие поля: name, user_id, user_uuid, ip, origin, user_agent, language.
Таблица 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)
Таблица 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. Таблица содержит 4 колонки.
Для очистки очереди используйте запрос удаления.
mysql> DELETE FROM users_messages WHERE id = 2; Query OK, 0 ROWS affected (0.08 sec)
Таблица 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 содержит данные для авторизации пользователей на комет сервере.
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 данные присутствуют.
Для удаления данных авторизации пользователей используйте запрос delete
DELETE FROM users_auth WHERE id = 12; Query OK, 0 ROWS affected (0.00 sec)
Основная статья зарезервированные имена каналов
Так же есть каналы с особыми свойствами, о всех них ниже по тексту.
Если вы написали обёртку для работы с CometQL api для какого нибудь фреймворка то будет здорово если вы поделитесь своей наработкой с другими пользователями. Присылайте ссылки на репозиторий с вашей обёрткой на support@comet-server.com
Для пользователей опенсорс версии полезно понимать что запросы попадающие в CometQL не передаются в бд комет сервера в MySQL они парсятся собственным парсером комет сервера. И таблицы из CometQL не являются прямым отражением таблиц из CometQL.