私はPHPとMySQLを使用しています。
pubnub プッシュ API にサインアップしたばかりで、Pubnub が提供する PHP プッシュ API を使用して最初のプッシュ通知を正常に作成しました。私はこのリアルタイム テクノロジに慣れていないので、自分で理解するのが難しいと思ういくつかの質問を思いつきました。私は何度もグーグルで検索し、stackoverflow全体を検索しました。他に関連する提案や質問が得られなかったので、ここに質問を書き留めて、アドバイスや専門知識の助けを求めています.
Pubnub は、クライアントごとに 2 つ以上のチャネルを作成するのは良くないと述べています。したがって、私のアプリケーションでは、Web サイトのどこでも発生する通知をリッスンするために 2 つ以上のチャネルを作成する必要がありますが、Pubnub が提案したように、ログインしているユーザーごとに 2 つのチャネルを使用します。
- ログインしたユーザーは Channel1-Public をリッスンします
- ログインしたユーザーは、プライベートの UsersOwnDynamic-Channel をリッスンして、関連する通知を受け取ります。
参考までに: PubNub のこのリンクは、チャネル スヌーピングを回避するために LongChannel 名を作成することについて述べています。
私の質問は次のとおりです
。 A. Web サイトにログインするたびに、常に新しいプライベート動的チャネル名を作成する必要がありますか。もしそうなら、他のユーザーが私のプライベート チャネルに通知を送信する方法を知るにはどうすればよいでしょうか。または、他の認証されたユーザーがテーブルをクエリして私のプライベート チャネルを取得できるように、データベース テーブルに静的チャネル名を 1 つだけ格納する必要がありますか?通知を送信する名前。この場合、ハッカーが特定のユーザーのプライベート チャンネル名を入手すれば、そのチャンネルを聞くことができると思いませんか?
BI は PHP と MySQL を使用しているため、別のユーザーのプライベート チャネルにメッセージを送信する方法を考え出すことも、解決策を思い付くこともできません。
簡単な友達リクエストシステムの例を見てみましょう。
- UserA が UserB に友達リクエストを送信します。
- UserB は、DynamicPrivateChannelB と呼ばれる自分自身の動的プライベート チャネル名をリッスンしています
(UserA は、プライベートである UserB のチャネル名をどのように見つけるのでしょうか?私は、これに対する唯一の方法は、UserB のプライベート チャネルをすべてのデータベース テーブルに格納することだと考えています。ログインしているユーザーがクエリを実行します。私の考えは正しいですか?)
<?php
//first way. How can i possibly achieve this.
$sqlquery = "sent friend request from userA to userB";
require('Pubnub.php');
$pubnub = new Pubnub( 'pubkey', 'subkey' );
$pubnub->publish( array(
'channel' => 'how do i find the private channel name for userB to sent this notification?',
'message' => array('friend_request' => 'A friend request') )
);
//2nd way ? Is this the right way ?
$sqlquery = "sent friend request from userA to userB";
$privatechannelofuserB = "get the channel name of userB from the db table";
require('Pubnub.php');
$pubnub = new Pubnub( 'pubkey', 'subkey' );
$pubnub->publish( array(
'channel' => '$privatechannelofuserB',
'message' => array('friend_request' => 'A friend request') )
);
?>
C. 動的なプライベート チャネル名を常に生成し、データベース テーブルに格納し、新しい動的チャネル名が生成されるたびに更新する場合。新しい動的プライベート チャネル名が古い名前に置き換わるため、一部のメッセージが配信されないため、問題が発生すると思います。
D. そのため、新しい友達のリクエスト、新しいプライベート メッセージの返信、新しいギフトのリクエストなど、1 つのチャネルに送信する通知がたくさんあります。これらすべてのデータをチャネルに送信する方法と、受信した新しい通知データを見つけて解析する方法。JSON が送信する形式であることは知っていますが、送信の形式についてはわかりません。
このリンクによると、単一の Pubnub チャネルには最大 100 個のメッセージしか含めることができません。一度に 200 件のメッセージが 1 つのチャネルに届いた場合、最初の 100 件が配信され、残りはキューに入れられるということですか? 一度に 10,000 件のメッセージが 1 つのチャネルに届いたらどうでしょうか。残りのメッセージはすべてキューに残りますか? もしそうなら、それはどのようにしてサブスクライバーにリアルタイムで配信されますか?
私が達成しようとしている別の簡単なシナリオを挙げましょう。
- UserAは認証され、Web サイトにログインします。
- UserAは、独自の動的チャネル名UserAx732dsw3efsdfsdfsdfを生成します。
- UserAは、新しく作成したチャネルUserAx732dsw3efsdfsdfsdf
のリッスンを開始します (これで、userA は他のユーザーからのメッセージの受信を開始するはずです)
- UserBがuserAにプライベート メッセージを送信します。
(ここで、新しいプライベート メッセージについてプライベート チャネルで通知されるのは userA だけです。userBまたは システムは、チャネル名UserAx732dsw3efsdfsdfsdfをどのように見つけることができますか ?これと同じことがuserBにも起こっています. userBが他のエンティティまたはシステムから再度通知を受ける必要がある場合は、 userBの動的チャネル名を見つける方法が必要です.
別の問題は、このシナリオは、ユーザーが Web サイトにログインするたびにチャネル名を動的に生成している場合です。動的チャネルに送信されたすべてのメッセージはどうなりますか? pubnub は作成したすべてのチャンネル名をサーバーに保存しますか? チャンネル名がまだ所有されていて、少なくとも 1 人のユーザーがそのチャンネルを聞いているかどうかをシステムまたはユーザーが確認できる方法はありますか?
私が持っている次の概念のため、これを知りたいと思っています。
- UserAは、午前 1時にWeb サイトにログインすると、dynamicChannelAを作成します。
- UserA が自分の動的チャネルに大量の通知プッシュアウトを受け取り始めますdynamicChannelA
- ここで、UserAは午前 1 時 30 分に Web サイトからログアウトします。ユーザー A が次に Web サイトにログインするまでに、UserAは別の動的チャネルをリッスンするため、動的チャネル Aにまだ通知をプッシュしている他の多くのユーザーはどうなるでしょうか。チャンネル名。UserAは、以前のチャネルdynamicChannelAをリッスンしません。
データベーステーブルから特定のユーザーのチャンネル名を取得する方法を考えています。チャンネルの不正な購読を防ぐ方法または方法はありますか? チャンネル名の長さに関係なく、サブスクライブキーとチャンネル名があれば、誰でもチャンネル名にサブスクライブできるからです。すべてのサブスクリプションはクライアント側で行われ、サブスクリプション キーとチャネル名が表示されるので、ちょっと興味があります。