我正在使用 PHP 和 MySQL。
我刚刚注册了 pubnub 推送 API,并使用 Pubnub 提供的 PHP 推送 API 成功发出了我的第一个推送通知。我是这种实时技术的新手,所以我提出了一些我觉得难以理解的问题。我用谷歌搜索了很多次,并在stackoverflow上进行了搜索。我在其他地方没有得到任何相关的建议或问题,所以我在这里写下我的问题,寻求您的建议和专业知识的帮助。
Pubnub 表示,为每个客户创建两个以上的频道并不是一件好事。因此,在我的应用程序中,我需要创建两个以上的频道来收听我网站上各处发生的通知,但我将为每个登录用户使用两个频道,正如 Pubnub 建议的那样。
- 登录用户收听 Channel1-Public
- 登录的用户收听私有的 UsersOwnDynamic-Channel 以接收相关的通知,并且只针对他。
仅供参考:PubNub 中的此链接说有关创建 LongChannel 名称以避免 Channel Snooping
我的问题如下:
A. 每次登录网站时,我是否总是需要创建一个新的私人动态频道名称。如果是这样,其他用户如何知道如何向我的私人频道发送通知。或者,我是否只需要在数据库表中存储一个静态频道名称,以便其他经过身份验证的用户查询该表并获取我的私人频道向我发送通知的名称。如果是这样,你不认为如果黑客掌握了某些用户的一些私人频道名称,他们将能够收听该频道吗?
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. 所以,我有很多通知要发送到一个单一的频道,比如新朋友请求、新私人消息回复、新礼物请求和许多其他类似的。如何将所有这些数据发送到通道以及如何找出和解析传入的新通知数据。我知道 JSON 是发送的格式,但我不确定发送的格式。
根据此链接,单个 Pubnub 频道最多只能包含 100 条消息。这是否意味着如果 200 条消息同时发送到单个通道,则前 100 条消息被传递,其余消息在队列中?如果 10,000 条消息同时发送到一个频道会怎么样?是否所有剩余的消息都留在队列中?如果是这样,它如何实时交付给订户?
让我给出另一个我想要实现的简单场景。
- UserA已通过身份验证并登录到网站。
- UserA生成自己的动态频道名称,UserAx732dsw3efsdfsdfsdf
- UserA开始收听他新创建的频道UserAx732dsw3efsdfsdfsdf
(现在,userA 应该开始接收来自其他人的消息)
- UserB向userA发送私人消息。
(现在,只有 userA 应该在他的私人频道上收到关于新私人消息的通知,userB 或系统如何找到 频道名称UserAx732dsw3efsdfsdfsdf因为,这是一个由userA动态生成的私人频道,系统或 userB都没有访问过同样的事情也发生在userB 身上,如果userB应该被任何其他实体或系统再次通知,应该有办法找出userB的动态频道名称。
另一个问题是这种情况是,如果用户每次登录网站时都动态生成频道名称。发送到动态通道的所有消息会发生什么?pubnub 是否将所有创建的频道名称保存在其服务器上?有没有什么方法可以让系统或用户找出频道名称是否仍然是自己的,并且至少有一个用户正在收听频道?
我很想知道这一点,因为我有以下概念:
- UserA在凌晨 1点登录网站时创建了dynamicChannelA。
- UserA 开始收到大量通知推送到他的动态频道dynamicChannelA
- 现在,UserA在凌晨 1:30从网站注销,许多其他仍在向他的dynamicChannelA推送通知的用户会发生什么,因为当UserA下次 登录网站时,UserA将监听不同的动态频道名称。UserA不会收听他以前的频道dynamicChannelA。
我正在考虑使用从数据库表中检索特定用户的频道名称的方法。是否有任何方法或方法可以防止未经授权的频道订阅?因为任何人都可以订阅频道名称,只要他们有订阅密钥和频道名称,无论频道名称有多长。我只是好奇,因为所有订阅都发生在客户端,并且订阅密钥和频道名称是可见的。