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……");
  }
  这是防止某个程序执行太多,让服务器崩溃,本人菜鸟级别,如果以上有什么不对的欢迎指出来

猜你喜欢

转载自www.cnblogs.com/dyj--php/p/8963521.html