我们的网站上有一些小组成员可以发送消息。当有新条目时,我想注意每个小组的成员。
最好的方法是什么?
答案 0 :(得分:0)
如果您想立即通知他们,您可以在存储邮件时立即向他们发送电子邮件。
否则,您可以为每个用户存储最高的“读取”消息ID,然后您可以非常轻松地获取任何后续消息。
答案 1 :(得分:0)
如果每个组可能会有很多消息,而不是像LastNotificationTime
那样具有组级字段,那么计划任务以查找当前LastNotificationTime
值后创建时间的消息(然后将有关它们的报告发送给用户)并将LastNotificationTime
更新为当前时间。
更好的是拥有用户级LastActivityTimeInGroup
字段并将消息创建日期与之比较(可能会为其添加一些分钟以获得更流畅的体验),因此只有当时非活动用户才会收到任何消息,如果有的话每个任务间隔时间不超过1个。
答案 2 :(得分:0)
我目前使用密钥存储区(memcachedb)。你可以做的是添加一个键,例如'messageread_ {message.id} _ {user.id}'设置为你选择的任何值(我只使用int 1),然后使用memcached客户端为所有人做一个getmulti用户拥有的消息(作为上面发布的密钥数组)。读取的任何键都是:)
我将此方法与此查询本身的60秒缓存一起使用,为用户提供未读邮件计数,效果很好。
我最初使用了最高级别的ID类型检查,并且在切换到多级评论系统后不久,因此在该上下文中使得最高的id没有实际意义(因为您可能最终看到评论而错过了一个回复)。到目前为止,这种方法一直很快。
要做这样的事情,你需要分别从pecl http://pecl.php.net/package/memcache和这里http://pecl.php.net/package/memcached安装memcache或memcached客户端。安装memcachedb(需要一个具有shell访问权限的盒子),并启动该服务。
客户端伪代码将运行如下:
//获取用户属于
的消息...代码
//从该列表构建一个memcachedb键数组,将键设置为message_id以便稍后引用
$keys = array();
foreach($mresult as $current){
$keys[$current['message_id']] = 'messageread_'.$current['message_id'].'_'.$myid;
}
//使用“memcached”php客户端
$result = $memcacheobj->getMulti($keys);
getmulti返回'memcachekey'=>结构中的关联数组'memcachevalue'
//循环结果,从键中删除找到的结果
foreach($keys as $key => $val){
if(isset($result[$val])) unset($keys[$key]);
}
//清理以获取未读消息数组,使用flip数组将值设置为message_id,使用array_values重置数组键(可选)
$unread = array_values(array_flip($keys));
现在您在结构中有一系列未读消息:
阵列( 0 => 12, 1 => 23, 等等... )
这只是该过程的一个粗略模型,我确定可以进行一些清理来优化这个:)