Heim  >  Artikel  >  Backend-Entwicklung  >  php+mysql做后台,怎么实现用户登陆,推送消息

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

WBOY
WBOYOriginal
2016-06-06 20:32:371400Durchsuche

大概情况是这样的:
当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 做

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn