自动通知在数据库的变化:类似于facebook的朋友请求

automatic notification in database change :similar with facebook friend request

本文关键字:类似于 facebook 朋友 请求 变化 通知 数据库      更新时间:2023-09-26

我想开发一个基于PHP mysql的社交网站。注册用户可以选择添加其他用户为好友,就像在Facebook中一样。

如果用户A点击用户B个人资料上的"添加好友"链接,则相应的好友请求记录将在A和B的数据库中生成。当B访问等待的好友请求显示页面(如配置文件页面)时,将显示查询B的db的请求。我认为这很简单。

但是当B在线时,C可以向B发出好友请求。我想通知B,即使B没有刷新他/她的个人资料页面(或任何显示等待好友请求的页面),C已经发出了这样的请求。至于通知的类型,它可以是一个显示等待好友请求总数的框。单击该框将显示详细信息。也可以是其他形式

我的兴趣点是如何使B意识到一个新的朋友请求,而B在线而不让他/她刷新包含朋友请求的页面?

为了最终确定答案,我假设您很好地理解了数据库/通知DATA逻辑,现在您只关心如何将其传递给浏览器。我将在这里列出所有的要点。

  1. HTTP是PULL协议。无法将数据从服务器推送到客户端
  2. 所以,你可以做的是-不断轮询服务器的新通知。

你可以做两种类型的轮询:-

  1. Short-polling—您向服务器发送一个Ajax请求以获得新的通知。
    • 这是一个很短的请求,但是你可以在一段时间内连续执行(比如10秒)
    • 服务器处理PHP并立即返回。
    • 处理返回的数据(例如:显示通知)
  2. 长轮询 -您发送与上述相同的请求。但是…
    • 在这种情况下,请求的PHP文件进入一个无限循环,不断检查DB。
    • 当DB发生变化时,PHP文件"回显"它并结束循环。现在请求已完成,数据已在浏览器中接收。
    • 你处理数据。
    • 启动另一个长轮询Ajax请求,重复上述步骤。
    • (额外:如果PHP在特定超时时间内未完成,则中止当前请求并开始新请求)

接下来,您可以用两种不同的方式实现这些:

  1. 写你自己的Javascript代码 -需要一些专业知识,但你可以学习它!
  2. 使用一些库 -简单,节省时间。你可以使用PubNet, BeaconPush等

我希望这对你来说是一个清楚的想法!

您需要编写javascript,在每个时间间隔后向服务器发送请求。然后在服务器端,您可以查询数据库,并在有任何新的朋友请求时响应客户端。

使用javascript setinterval函数
var refreshId = setInterval(function(){  
$.ajax({
type: "POST",
url: "request.php",
data: 'more_updates='+more_updates, // or any data you want to send
cache: false,
success: function(html){
$('.old_updates').prepend(html).fadeIn('fast'); // response from server side process
}
});
}
},10000);

这里我们每10秒发送一次数据。所以在服务器端,如果我们有任何新的朋友请求挂起,它会更新客户端。

首先,您不需要为每个人保留单独的数据库/表。您可以保留一个包含以下列的数据库表:

table_friendship

+------+---------------+-------------+------------+
|  id  |  friend_from  |  friend_to  |  approved  |
+------+---------------+-------------+------------+
|  1   |      A        |      B      |     NO     |
+------+---------------+-------------+------------+
|  2   |      C        |      B      |     NO     |
+------+---------------+-------------+------------+

在这个表格中,条目1表示A请求B建立友谊,但未被批准。条目2意味着,C请求B建立友谊,但尚未被批准。

下一步,是通知"B"两个请求已经到达服务器。遗憾的是,服务器不能向客户端(浏览器)发送消息。我们所做的是,通过AJAX请求不断轮询服务器。该请求的工作方式与任何其他页面请求一样,但不同之处在于,您可以请求PHP页面而无需重新加载浏览器。

您可以以10秒的间隔请求friend_requests.php页。该页面应该执行以下操作:

  1. 做SQL "SELECT COUNT(*) FROM table_friendship WHERE friend_to = B AND approved = "NO"(只是一个伪SQL !)
  2. 返回以下数据:待处理请求数、新请求数等。

在浏览器端,您可以在指定的"BOX"中显示此数据。

当您批准请求时,您再次将AJAX请求发送到另一个PHP页面,将approved列更改为"YES"

关于Ajax的更多信息- en.wikipedia.org/wiki/Ajax_(programming)

我想你是在搜索推送通知服务。

您可以实现自己的服务(使用Comet),也可以订阅公共服务。

例子:

PubNub, BeaconPush

用谷歌你会发现更多。

编辑

我想我的回答不够清楚。根据我的建议,您可以这样做(使用pubnub):

用户B(用户ID 7)向用户a(用户ID 8)写好友请求。在PHP处理程序中:

$pubnub->publish(array(
    'channel' => 'friend_requests_8',
    'message' => array( 'request_from' => '7' )
));

我不太习惯php,但是我希望你能理解我的意思。

在客户端页面,你可以注册到你的频道('friend_request_'),然后处理请求:

// PUBNUB.subscribe() - LISTEN
PUBNUB.subscribe({
    channel  : "friend_request_<? echo $user_ID; ?>",
    callback : function(message) { alert('FRIEND REQUEST FROM USER ID: ' + message.request_from) }
})
因此,使用这个解决方案,您将不必处理任何计时或循环,因为pubnub为您处理这些。Facebook就是这么做的(据我所知),EA的《Battlelog》使用了BeaconPush,在我看来,这是一个很棒的网站,有很多有趣的网络技术。