CometQLは、MySQLプロトコルを使用してsaas cometsサービスを操作するためのapiです。
なぜかっこいい
たとえば、ユーザーがいつオンラインであったかに関する情報を取得するには、次のクエリを実行します。
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の概要
CometQLは外部的には一種のデータベースです。 さらに、接続時にCometQL_v1データベースを選択する場合、これは実際に対話するAPIのバージョンを示す指示です。
バックエンドにMySQLサーバーがないことを理解する必要があります。リクエストは、彗星サーバーによって直接解析および実行されます。 そして、可能なアクションをすべてテーブルとクエリの形式で表示することは、多くのウェブマスターにとって便利で馴染みのあるものです。
Pipes_messagesテーブル
pipes_messagesテーブルには、パイプを介して送信されたメッセージが含まれます。 チャネルにメッセージを送信するには、このテーブルに挿入リクエストを実行する必要があります。
mysql> insert into pipes_messages (name, event, message)values("pipe_name", "event_in_pipe", "text message"); Query OK, 0 rows affected (0.13 sec)
「名前」および「イベント」フィールドは、次の正規表現[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)
メッセージ送信のオンライン例
パイプテーブル
パイプテーブルには、チャネルからのメッセージをサブスクライブした人数に関する情報が含まれています。 テーブルは読み取り専用です。
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)
オンラインチャンネルサブスクリプションの例
テーブル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)
ここで、長さパラメーターは、最近のメッセージがいくつ記憶されるかです。 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段階で行われます。 最初のステップは、システム上のユーザーIDとランダムハッシュを彗星サーバーに送信することです。
mysql> INSERT INTO users_auth (id, hash )VALUES (1, 'auth_hash1');
- ここで、行auth_hash1はテキスト認証キーです。 自分でサーバー上で生成し、最初にusers_authテーブルの挿入リクエストを使用して彗星に送信し、次にJavaScriptに渡して彗星サーバー上の特定のユーザーを承認します。
- サイトのユーザーID、9桁以下の正の整数。
第2段階では、この情報(ユーザーIDとハッシュ)をJavaScript Apiに渡す必要があります
$(document).ready(function() { CometServer().start({dev_id:1, user_key:"auth_hash1", user_id:"__" }) });
ここで、dev_idは開発者の公開識別子です 。
これで、ユーザーは彗星サーバーで承認されます。
許可ユーザーへのメッセージ配信
許可されたユーザーにメッセージを識別子で送信する(users_messagesテーブルにリクエストを挿入する)と、メッセージは、現在許可されているすべてのデバイス(最大16台のデバイス)のユーザーに配信されます。 これは、ユーザーがサイトにアクセスし、複数のデバイス(たとえば、電話とコンピューター、または2つの異なるブラウザーに同時に座っている)からサイトにログインする場合に非常に便利です。
その人が現在オフラインの場合、メッセージはメッセージキューに入れられ、その人がオンラインになったときに配信されます。 現在、各ユーザーの最大キューサイズは制限されています。
メッセージキューの主な目的は、人が短期的にoflineに移行した後のメッセージ配信です。 たとえば、接続が開かれたサイトのページを更新する場合、約1秒間oflineに移動します。
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)
メッセージはすぐにユーザーに送信されるか、後でユーザーに送信するためにキューに入れられます。
ユーザーにまだ配信されておらず、キューにあるすべてのメッセージを受信するには、選択リクエストを実行する必要があります
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つのメッセージが送信を待機していることがわかります。 ユーザーがオンラインに表示されるとすぐに送信されます。
表には次の列が含まれます。
- id-ユーザーID
- index-キュー内のメッセージ番号
- イベント-イベント名
- message-メッセージ本文
削除要求を使用して、キューをクリアします。
mysql> delete from users_messages where id = 2; Query OK, 0 rows affected (0.08 sec)
メッセージがユーザーに配信された後、メッセージはメッセージキューから自動的に削除されます。
Users_timeテーブル
users_timeテーブルには、ユーザーがいつオンラインになっていたかに関する情報が含まれています。 テーブルは読み取り専用です。 時間データはUNIX時間に保存されます
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のユーザーは7月30日にオンラインであり、ID = 145のユーザーにはデータがありません。
Users_authテーブル
users_authテーブルには、cometサーバー上のユーザーを承認するためのデータが含まれています。
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にはデータが存在します。
ハッシュフィールドでは、長さが32文字以下で、 正規表現[0-9A-z = + / _]に一致する行のみを送信できることに注意することが重要です。
ユーザー認証データを削除するには、削除クエリを使用します
delete from users_auth where id = 12; Query OK, 0 rows affected (0.00 sec)
公開APIを作成する人向けのヒント
ここで、私の意見では、公開APIインターフェースを作成しようとしている人にとって最も有用な3つの記事:
実際のプロジェクトでCometQLを使用するその他の例
CometQLの使用例は、サイトでチャットを行う方法に関する記事と、サイトでのプライベートチャットの統合に関する記事です。