php评论使用websocket
一般评论分这几种模式:1.盖楼模式(例如网易新闻这种的,较为复杂)2.单条新增模式(比如laravel-china社区的评论系统,也是不盖楼模式)
1.单条新增模式比较简单(1.单条模式:不管新增评论还是回复评论都是一条新评论 2.单条引用模式:新增评论是一条新评论,回复评论时下面会显示会显示回复的是哪条评论)
单条模式:(数据库设计)
id (自增i主键,评论id)
content (评论内容)
user_source (用户来源,微信,微博,app等)
user_code (用户标识,app端传来识别用户的)
user_pic (用户头像)
add_time (添加时间)
level (是否置顶)
其它字段......
单条引用模式(数据库设计):
id (自增主键,评论的id)
content (评论内容)
add_time (评论时间)
r_id (被回复者的id)
r_content (被回复者评论内容)
r_time (回复时间)
level (回复是否置顶)
其它字段........(这里我喜欢把回复的评论和被回复评论当作一条评论,在控制器里根据r_id(被回复的评论id)去redis里取数据,如果没有就去查数据库并存入redis设置过期时间,把获得的数据插入数据库,也可以去掉r_开头的字段换为parent_id,通过这个遍历查询去获取)
2.盖楼这种模式目前我会的是通过parent_id来递归查询,如果是第一条被评论的parent_id为0,其余parent_id是被评论的id,但这种方式特别消耗内存
从前端获得了评论的数据,我们用websocket进行发送的时候,最好压缩一下评论字段,这样可以节约服务器资源,比如有10000个人在线,其中一人发了一条评论,其余9999个人都得看见,那本来很长的字段压缩后总数据量大小就减少了,
用websocket发送时可以通过post方式和redis订阅方式发送,我更倾向于redis订阅方式的发送,你可以对评论添加进行日志的管理
post方式发送要有websocket的服务器地址和要发送的数据,发送的数据中要有一个key值是在websocket中注册过的
redis订阅方式的发布要先连上redis服务器,也要在websocket上注册过的key,还有要发送的数据
评论发送websocket时也分为先审后发和先发后审,先审后发比较简单,有数据先进redis队列,然后通过Linux的crontab程序刷进数据库,后台要操作哪条就发哪条的websocket
先发后审的话有数据也是先进redis队列,评论并发多的话就要有两种队列,发websocket的队列和不发websocket的队列,然后通过Linux的crontab程序刷进数据库
crontab是最低每分钟执行一次,你可以自己写一个php文件每秒执行一次,php文件里就写个for循环执行,但要在文件最前部加上这么一段代码
$cc = exec("ps -ef |grep '" . __FILE__ . "' | grep -v 'grep' | wc -l");
if ($cc > 10) {
exit("program is running……");
}
这是防止某个程序执行太多,让服务器崩溃,本人菜鸟级别,如果以上有什么不对的欢迎指出来