大家好我正在运行一个php / mysql约会网站,我希望在某些操作上为成员实现屏幕通知(例如,当其他成员查看您的个人资料,发送一个眨眼等等)。当有人在您的个人资料上发表评论或写信时,非常类似于在mac或facebook通知上咆哮。
我不太确定从哪里开始 - 我是否必须在服务器端实现一些推送机制?是否有客户端的jquery插件?
提前感谢。
答案 0 :(得分:3)
通常是每隔一段时间从数据库中拉信息并将其显示给用户。在你的情况下,这可能就足够了。例如:
跟踪您要通知的内容。假设用户A访问用户B的个人资料,向用户B的通知表添加通知消息。如果用户C向用户B眨眼,则向用户B的列表添加另一个通知。
检查是否有新通知。检索完通知后,将其标记为已读,以便它们不再显示。
<强> JS 强>
// set an interval to run a function every 5 minutes
// (300000 = 1000 * 60 seconds * 5 minutes)
setInterval(function() {
// call on check.php
$.post('check.php', {
// add a variable with the userId,
// so the script knows what to check
userId: 123
}, function(data) {
// say there are notifications, which are stored in data
// now display them in any way you like
});
}, 300000);
<强> check.php 强>
$userId = $_POST['userId'];
// make sure to only show new messages
$notifications = array();
$sql = "SELECT message FROM notifications WHERE userId = $userId AND new = 1";
$res = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($res)) {
while ($r = mysql_fetch_object($res)) {
$notifications[] = $r->message;
}
}
// now make sure that all the notifications are set to new = 0
$sql = "UPDATE notifications SET new = 0 WHERE userId = $userId";
mysql_query($sql) or die(mysql_error());
// you can handle the markup wherever you want,
// e.g. here and simply show each message a new line
// this data will be returned to the jQuery $.post method
echo implode('<br />', $notifications);
基本上:JS每5分钟调用一次'script.php','script.php'可能会向JS函数返回新的通知,你会显示这些消息。这只是为了让您了解可能的解决方案。
真正的推送通知比看起来更难。这将需要一个持续的开放连接,允许新消息立即发送给用户。您需要查看Comet model之类的内容。但在大多数情况下,如果有轻微的延迟并不重要。我在我的示例中使用了5分钟,但也可能是1分钟或10或30分。这还取决于您拥有的用户数量以及这些常规检查将导致的负载类型。但通常所有这些都会在几分之一秒内完成,并且可以通过间隔轻松完成,即使它是一个非常短的间隔。
答案 1 :(得分:0)
我可能有点迟到这个答案,但如果有人来这里寻找与这种用例相关的客户端插件,我已经创建了一个开源的jQuery通知系统,可以与之无缝集成网络应用,称为jNotifyOSD。您可以在该链接上看到演示。代码向上on GitHub。我试图保持API干净,简单易用。这是一个例子:
$.notify_osd.create({
'text' : 'Hi!', // notification message
'icon' : 'images/icon.png', // icon path, 48x48
'sticky' : false, // if true, timeout is ignored
'timeout' : 6, // disappears after 6 seconds
'dismissable' : true // can be dismissed manually
});
您甚至可以为所有将来的通知设置全局默认值(可以基于每个通知进行覆盖):
$.notify_osd.setup({
'icon' : 'images/default.png',
'sticky' : false,
'timeout' : 8
});
更新[2012年12月13日] :
已经有一段时间了,但我终于使用队列系统实现了对多个可见通知的支持。例如:
$.notify_osd.setup({
// ... config ...
'visible_max' : 5 // max 5 notifications visible simultaneously
'spacing' : 30 // spacing between consecutive notifications
});
您可以看到演示here。我认为该插件现在足够灵活,可以涵盖各种用例。