0

我的任务是构建一个日历和议程库(我正在开发 CodeIgniter 框架),它显示一个日历并且用户可以在该日历上设置事件。这些事件将有一个电子邮件通知系统,并且当用户浏览该站点时,一个弹出窗口。

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

现场通知是另一回事。我将如何处理这个?我只是不能每 x 秒向服务器发出一个 ajax 请求,因为这会给系统带来不可接受的负载。(当然,当最终通知用户时,必须提出请求,将用户设置为数据库上的“remined”)。我不能只依赖用户的日期时间,因为他可能在世界任何地方,而且时间会有所不同。如何检查是否必须通知用户事件,避免向服务器重复请求?将不胜感激任何输入。

4

2 回答 2

1

易于扩展的通知系统使用 websockets,如今它已经覆盖了大多数用户,甚至在移动设备上也是如此。不幸的是,您需要一个支持 websocket 的服务器——节点、glassfish 等等——这不能通过标准的 PHP 部署(mod_php 或 fcgi)来完成。服务器事件(所谓的服务器推送)是在生成时发送的,所以一旦你有了 websocket 客户端-服务器对,发送提醒就像发送电子邮件一样。

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

  1. 将提醒与每个请求一起发送给客户端(这可能会浪费带宽,但我不认为 JSON 编码的事件列表如此重量级)
  2. 按需异步下载提醒,即仅当用户点击通知图标时

此方案允许您重用 PHP 环境和代码,并且不需要其他主机用于 websocket 服务器。我认为这是最好的解决方案,即使这不能满足您对服务器在正确时间触发的真正弹出提醒的要求。顺便说一句,如果您在每个请求中发送事件,您的 javascript 可以在需要时弹出 - 您可以使用setTimeout()它。

于 2012-12-04T20:18:13.420 回答
1

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

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

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

干杯

于 2012-12-04T21:33:33.263 回答