php+mysql做后台,怎么实现用户登陆,推送消息

 nnamyp_826 发布于 2022-12-01 09:44

大概情况是这样的:
当A登陆以后,可以发消息给B,如下图,选择B的工号

发送以后,B登陆,可以在部门消息那里会显示一个小红点,提示有消息

我的思路是这样的:当A按下发送以后,就向存放消息的数据库里写一条记录,并把消息的状态码设置成未读,接收人是B,当B登陆以后,因为状态码是未读,就会显示提示信息。可是这个提示怎么实现?

这是我消息的数据库:

如果我一次发同样的消息给多个人,是不是应该写多条记录?向数据库写消息要循环?
还有一个问题是:如果我的消息中包含图片,图片是不是要放在一个文件夹里?
希望能给点意见,谢谢!

8 个回答
  • 你确定只是在用户登录时看到消息就可以了是吧。如果是,那接着往下看。

    1. 如何进行消息提示

    在你的表里,message_id应该是这个表的主键,每个消息都对应着一个message_id。当某用户登录时,就查询这个message表里的receive_id和message_status,即查询登录的用户中未读消息的个数,若个数>0,表示有未读消息,登录成功跳转时,有一个mes_status的字段也同时传过去。比如跳转到首页(index),index中再判断mes_status的值,给用户以提示。

    2. 若发送给多人呢

    其实你的message表里的主键是message_id,跟发送给几个人没什么关系,当他登录时,只查询这个用户自己作为接收方,收到的消息的个数。比如数据表里有这样的一些数据:

    message_id send_id message_date message_title message_content receive_id message_status
    1 111 2015-06-25 13:00:00 hello hello world 222 1
    2 111 2015-06-25 14:00:00 may 中国,你好 333 1
    3 444 2015-06-26 11:00:00 wenzi wenzi 222 1
    4 666 2015-06-26 16:00:00 hello hello world 222 1

    用户111可以给多个用户222, 333发送消息,并不冲突;用户也能接收多个其他用户的消息,比如222。当用户(userid=='222')登录时,就查询(receive_id==userid)的消息即可。

    3. 若消息中有图片怎么办

    你的推断是对的,首先应该把用户上传的图片放到一个文件件中,然后返回给用户一个图片链接,用户把这个图片链接插入到消息中。

    2022-12-01 10:33 回答
  • 这个要用到推送。
    说实话。PHP不适合做推送。要用到ajax轮询。这样的话效率不高,还容易出问题。
    这里已经有很不错的解决方案了。
    http://segmentfault.com/q/1010000000589829/a-1020000000591493

    2022-12-01 10:33 回答
  • 发送消息 都可以直接写db 附件当然是得有个静态文件服务器进行上传生成url 也方便以后的扩展;
    至于推送到浏览器,客户端 就必须用长连接(推荐),websocket(推荐)或者ajax轮询方式去实现. 监听状态变化接口

    2022-12-01 10:33 回答
  • 消息接收方的字段可以存储 1,2,3,4 这样发送多人就不需要写入多条数据了

    登录时候去查询消息推送表是否有未读消息

    如果需要在线 提示就需要做前端ajax轮询咯

    2022-12-01 10:33 回答
  • 实时性要求不高的话,前端可以每5分钟AJAX轮询一次消息表。

    如果要插入多条记录的话,建议开启事务,循环插入,提交事务,能加快插入速度。

    不想插入多条记录的话,可以像 @饭盒 说的那样,消息接收方的字段receive_id保存接收人的ID序列(1,2,3,4),消息状态字段message_status保存未阅读消息的接收人ID序列(2,3),message_status初始值为(1,2,3,4),已查看消息的用户ID则从其中删除。可以用MySQL内部函数FIND_IN_SET(返回找到的位置,从1开始)进行查询,比如:

    $user_id = 2;
    $sql = <<<heredoc
    SELECT * FROM `message` 
    WHERE FIND_IN_SET('{$user_id}', `message_status`) 
    AND   FIND_IN_SET('{$user_id}', `receive_id`);
    heredoc;
    

    数据量比较大的话,FIND_IN_SET可能会存在性能问题,建议定时清理message表过期的消息。

    2022-12-01 10:33 回答
  • workerman

    2022-12-01 10:33 回答
  • 可以用 workerman 做

    2022-12-01 10:33 回答
  • 你有没有这个消息提示的例子 可以发一下吗 QQ 784226527

    2022-12-01 10:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有