数据库更改中的自动通知:与Facebook好友请求类似

时间:2011-12-25 09:53:47

标签: php javascript jquery facebook social-networking

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

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

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

我感兴趣的是如何在B在线时让B知道新的朋友请求而不让他/她刷新包含朋友请求的页面?

4 个答案:

答案 0 :(得分:9)

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

  1. HTTP是 PULL 协议。您无法将数据从服务器推送到客户端。
  2. 因此,您可以做的是 - 不断轮询服务器以获取新通知。
  3. 您可以进行两种类型的轮询: -

    1. 短轮询 - 您向服务器发送Ajax请求以获取新通知。
      • 这是一个简短的请求,但是你会在一个间隔(比如10s)中连续进行。
      • 服务器处理PHP并立即返回。
      • 您处理返回的数据(例如,显示通知)
    2. 长轮询 - 您发送与上述相同的请求。但...
      • 在此,请求的PHP文件进入无限循环,持续检查DB。
      • 当存在数据库更改时,PHP文件“回显”它并结束循环。现在请求已完成,并在浏览器中收到数据。
      • 您处理数据。
      • 启动另一个长轮询Ajax请求,然后重复这些步骤。
      • (额外:如果PHP未在特定超时时间内完成,则中止当前请求并启动新请求。)
    3. 接下来,您可以通过两种不同的方式实现其中任何一种: -

      1. 编写您自己的Javascript代码 - 需要一些专业知识,但您可以学习它!
      2. 使用一些库 - 简单,省时。您可以使用PubNetBeaconPush
      3. 我希望这对你有一个明确的想法!

答案 1 :(得分:3)

你需要编写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);

这里我们每十秒发送一次数据。 所以在服务器端如果我们有任何待处理的新朋友请求是新的或未确认的,它会更新客户端。

答案 2 :(得分:2)

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

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. 返回以下数据:待处理请求数和新请求数
  3. 在浏览器端,您可以在指定的“BOX”中显示此数据。

    批准请求时,再次将AJAX请求发送到另一个PHP页面,将approved列更改为“是”

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

答案 3 :(得分:1)

我认为您正在搜索推送通知服务。

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

示例:

PubNubBeaconPush

谷歌会发现更多内容。

修改

我认为我的答案不够明确。根据我的建议,你可以这样做(使用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使用BeaconPush作为Battlelog,在我看来,这是一个很棒的网站,有很多有趣的网络技术。