我选择了 cronjob 路线,到目前为止工作良好。由于我们的系统需要通知这么多用户,我发现这是最合适的方式,原因有两个。
我不需要编辑我当前的脚本代码,插入函数来为我想要通知的每个事件添加通知。
由于某些操作会影响到许多用户,因此实时添加通知可能会导致脚本长时间延迟和超时。
我建立了一个名为通知的类,在这个类中,有一些函数可以为我想要通知的每个事件添加通知,例如: user_added_a_new_photo(); user_commented_on_a_photo();
对于每个通知生成,我会为每个用户添加 1 个条目以得到通知。这就是我的通知数据库的样子:
id
affected_user_id //user being notified
user_generating_the_notification_id
content_type // enum containing all type of notifications my system has (example: photo, video, comment) ...
content_json // a json containing the notification content. Based on the content type, on the display view file, I call helpers that will format the notification row using the json info.
date // the date the notification was added
seen_on // the date the user saw the notification
clicked_on // if user clicked on the notification, store the date he clicked on it
display // true or false
- 为此,我为我创建的每个新通知添加了显示字段原因,我检查数据库是否同一个用户,是否有来自同一个生成用户的另一个未见过的通知。如果此条件为真,我将旧通知设置为 display = false,并将两个新通知分组,结果如下:用户 X 在他的图库中添加了 X 张新照片。
- clicked_on 字段存储项目被点击的日期,因此如果需要,我可以根据此信息生成报告。显示内容时,如果此项不为空,我会突出显示通知以标记尚未选中的那些。
- 我创建了一个文本字段来将通知内容存储在 json 中,因为不同的通知有不同的样式来呈现给用户。例如,一个新的评论通知,只有文本,但一个新的照片通知,有一个预览拇指。
到目前为止,运行它并满足我的需求没有问题。
唯一的缺点是,由于 cronjobs 只能每 1 分钟运行一次,因此通知可能会延迟 1 分钟。但由于我不需要实时,我将 cronjob 设置为每 5 分钟运行一次。