现场通知系统

时间:2012-12-04 19:55:04

标签: javascript codeigniter mootools

我的任务是建立一个日历和议程库(我正在使用CodeIgniter框架),它显示了一个日历,用户可以在该日历上设置事件。 这些事件将通过电子邮件通知系统,当用户浏览网站时,会弹出一个。

我的问题是当用户在网站上时如何处理通知部分。电子邮件是我已经决定通过每x分钟运行一次的cronjob来完成的,并检查是否需要发送通知电子邮件。

现场通知是另一回事。 我该如何处理?我每隔x秒就无法向服务器发出一个ajax请求,因为这会给系统带来无法承受的负担。 (当然,当最终通知用户时,必须发出请求,将用户设置为数据库上的“remined”)。 我不能仅仅依赖于用户的约会时间,因为他可能在世界的任何地方,时间会有所不同。 如何检查必须向用户通知事件,避免向服务器重复请求?非常感谢任何意见。

2 个答案:

答案 0 :(得分:1)

易于扩展的通知系统使用websockets,现在即使在移动设备上也能覆盖大多数用户。不幸的是,你需要一个支持websocket的服务器 - node,glassfish,无论如何 - 这不能用标准的PHP部署(mod_php或fcgi)来完成。服务器事件(所谓的服务器推送)在生成时发送,因此一旦您拥有websocket客户端 - 服务器对,发送提醒就像发送电子邮件一样。

实际上事情更复杂,因为很可能用户不会在提醒弹出的确切时间在线。我建议每次用户点击页面时刷新一个通知图标。这样你的日历系统(假设一个cronjob)只会更新数据库中用户行的标志,当你构建页面时,你已经知道是否有提醒(比方说,在接下来的60分钟内),以及相应地选择图标。此时,您有两种选择:

  1. 将提醒发送给客户端以及每个请求(这可能是浪费带宽,但我不认为JSON编码的事件列表是如此重量级)
  2. 按需异步下载提醒,即仅在用户点击通知图标时
  3. 此方案允许您重用PHP环境和代码,并且不需要websocket服务器的其他主机。我认为这是最好的解决方案,即使这不符合您在正确的时间由服务器触发的真正弹出提醒的要求。顺便说一句,如果你发送每个请求的事件,你的javascript可以在需要时弹出 - 你可以使用setTimeout()

答案 1 :(得分:1)

我可以看到使用setTimeout来执行此操作。假设用户在提醒到期前$minutesTilDue分钟访问您的网页。假设jQuery / PHP:

$(function(){
    setTimeout(function(){
       showEventReminder(<?php json_encode($event) ?>);
    }, <?php echo $minutesTilDue ?> * 60 * 1000);
});

没什么太花哨的,但取决于你的要求......

干杯