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

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

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

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

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

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

  1. HTTP是一种PULL协议。 您无法将数据从服务器送到客户端。
  2. 因此,您可以做的是 – 不断轮询服务器以获取新通知。

您可以进行两种类型的轮询: –

  1. 短轮询 – 您向服务器发送Ajax请求以获取新通知。
    • 这是一个简短的请求,但你在一个间隔(比如10s)连续进行
    • 服务器处理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); 

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

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

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列更改为“是”

更多关于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_", callback : function(message) { alert('FRIEND REQUEST FROM USER ID: ' + message.request_from) } }) 

因此,使用此解决方案,您将不必处理任何计时或循环,因为pubnub会为您处理此问题。 Facebook这样做(据我所知)和EA使用BeaconPush作为Battlelog,在我看来,这是一个很棒的网站,有很多有趣的网络技术。