>백엔드 개발 >PHP 튜토리얼 >php+mysql做后台,怎么实现用户登陆,推送消息

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

WBOY
WBOY원래의
2016-06-06 20:32:371457검색

大概情况是这样的:
当A登陆以后,可以发消息给B,如下图,选择B的工号
php+mysql做后台,怎么实现用户登陆,推送消息

发送以后,B登陆,可以在部门消息那里会显示一个小红点,提示有消息
php+mysql做后台,怎么实现用户登陆,推送消息

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

这是我消息的数据库:
php+mysql做后台,怎么实现用户登陆,推送消息

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

回复内容:

大概情况是这样的:
当A登陆以后,可以发消息给B,如下图,选择B的工号
php+mysql做后台,怎么实现用户登陆,推送消息

发送以后,B登陆,可以在部门消息那里会显示一个小红点,提示有消息
php+mysql做后台,怎么实现用户登陆,推送消息

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

这是我消息的数据库:
php+mysql做后台,怎么实现用户登陆,推送消息

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

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

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. 若消息中有图片怎么办

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

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

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

消息接收方的字段可以存储 1,2,3,4 这样发送多人就不需要写入多条数据了

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

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

实时性要求不高的话,前端可以每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开始)进行查询,比如:

<code>$user_id = 2;
$sql = </code>

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

workerman

可以用 workerman 做

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.