我希望开发一个基于php mysql的社交网站。注册用户可以选择将其他用户添加为朋友,就像在Facebook中一样。
如果用户A点击用户B的个人资料上的“添加朋友”链接,则会在A和B的数据库中进行朋友请求记录。当B访问等待的朋友请求显示页面(如同配置文件页面)时,将显示查询B的数据库的请求。我认为这很简单。
但是当B在线时,C可以向B发出朋友请求。我想向B发出通知,即使B没有刷新他/她的个人资料页面(或任何显示等待的朋友请求的选项。至于通知的类型,它可以是一个显示等待的好友请求总数的框。单击该框将显示详细信息。或者它可以是任何其他形式。
我感兴趣的是如何在B在线时让B知道新的朋友请求而不让他/她刷新包含朋友请求的页面?
答案 0 :(得分:9)
为了最终确定答案,我假设你很了解数据库/通知数据逻辑,现在你只关心如何将它传递给浏览器。我会在这里列出所有要点。
您可以进行两种类型的轮询: -
接下来,您可以通过两种不同的方式实现其中任何一种: -
我希望这对你有一个明确的想法!
答案 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
。该页面应该执行以下操作:
"SELECT COUNT(*) FROM table_friendship WHERE friend_to = B AND approved = "NO"
(仅限伪SQL!)在浏览器端,您可以在指定的“BOX”中显示此数据。
批准请求时,再次将AJAX请求发送到另一个PHP页面,将approved
列更改为“是”
有关Ajax的更多信息 - en.wikipedia.org/wiki/Ajax_(programming)
答案 3 :(得分:1)
我认为您正在搜索推送通知服务。
您可以实现自己的(使用Comet),也可以订阅公共服务。
示例:
谷歌会发现更多内容。
修改强>
我认为我的答案不够明确。根据我的建议,你可以这样做(使用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,在我看来,这是一个很棒的网站,有很多有趣的网络技术。