V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xiparos
V2EX  ›  问与答

关于一个消息提醒的功能实现,请各位 V2Exer 帮忙解释一下

  •  
  •   xiparos · 2014-08-01 17:13:34 +08:00 · 4046 次点击
    这是一个创建于 3798 天前的主题,其中的信息可能已经有所发展或是发生改变。
    可能问题有些低级,但是我实在没做过这方面的功能实现,还恳请各位高手轻喷。

    问题一:拿知乎举个栗子,(也可以是非死不可):用户登录后,只要自己关注的人有新状态发布,(A回答了B的问题,C创建了一个问题。。)等等一类的消息,在用户栏上的实时提醒是如何做到的?

    PS: 刚才问了一个朋友说是通过AJAX定期向数据库发送GET请求,以抓取最新的更新信息,想了想也对,实现原理应该是这样的,不知道各位大牛有啥更好的实现方案。

    问题二:如果我想用PHP来实现这样的功能的话,有没有什么现成的框架或者插件能够实现这样的功能,还是说可以在框架的基础上自己写一个类似的消息推送功能?

    问题三:如果问题一里面的实现方案成立的话,是不是在建表的时候,需要有一个用户状态的表,比如叫user_status,专门用来插入每一条用户的更新(update)或者用户的动作(action),然后前台写一个AJAX,通过RESTful API对这个表的数据进行抓取,显示到前台。

    不知道上面的问题表述是否清楚,如果说的不够详细的话请多包涵,我也会尽量在跟贴里解释清楚,谢谢大家。
    17 条回复    2014-08-06 21:55:49 +08:00
    zzNucker
        1
    zzNucker  
       2014-08-01 17:25:17 +08:00   ❤️ 1
    comet / push /persistent connection
    arbipher
        2
    arbipher  
       2014-08-01 17:32:15 +08:00
    你想知道有没有人给打你电话?
    一种方式是定期看手机有没有来电提示(通过AJAX定期向数据库发送GET请求),
    另一种更直观的方法是,听电话铃有没有响(不要笑……),你的耳朵时时刻刻在做这个工作。
    你的耳朵和电话之间建立起“长连接”,“铃声”就是电话通过这个长连接推送给你的“消息”,你收到“消息”后再去看手机,到底是谁来电,是接电话还是装死。。。
    简单的长连接可以通过WebSocket实现,其实这个问题之前我也是在v2ex问的(http://v2ex.com/t/103113#reply3)
    xiparos
        3
    xiparos  
    OP
       2014-08-01 17:40:03 +08:00
    @arbipher
    @zzNucker
    多谢两位的精准信息,

    请问@arbipher tornado.websocket可以用在PHP框架下么?看了一下是用python写的
    arbipher
        4
    arbipher  
       2014-08-01 17:46:53 +08:00
    @xiparos
    websocket是一种协议,什么语言都有自己的实现。
    PHP我不熟悉,建议你等PHP大神的回复
    xiparos
        5
    xiparos  
    OP
       2014-08-01 17:48:34 +08:00
    @arbipher 好的,谢谢你
    em70
        6
    em70  
       2014-08-01 17:55:59 +08:00
    消息数据库加个已读标记字段,默认为0,定期监听未读消息,发现有未读就推送给用户,阅读后修改标记为1

    网页消息只能定期监听,没其他办法
    cloudzhou
        7
    cloudzhou  
       2014-08-01 17:57:22 +08:00
    如果要求及时性不那么高,简单的 ajax 按照时间轮讯就可以了,比如每一分钟。
    最好使用类似 redis 来做这种状态的保存。
    hcy
        8
    hcy  
       2014-08-01 18:04:09 +08:00
    简单地消息提醒还是用Server-sent Events这个好点。这个用php实现起来很简单.
    不过只支持html5
    https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events
    xiparos
        9
    xiparos  
    OP
       2014-08-01 18:23:35 +08:00
    刚才看了一下这个:
    http://stackoverflow.com/questions/603201/using-comet-with-php
    感觉PHP语言本身对于Comet的支持就不是很好,只能作为client端开发用。server端的话还得用Python,Nodejs这样的语言来实现Comet或者Websocket。
    xiparos
        10
    xiparos  
    OP
       2014-08-01 18:40:42 +08:00
    @hcy 好的,我看一下,谢谢
    raincious
        11
    raincious  
       2014-08-01 18:43:29 +08:00
    https://www.v2ex.com/t/119720

    我这是Ajax轮询实现的。

    WebSocket的话建议直接写一台通讯服务器,不然负担不小。
    xiparos
        12
    xiparos  
    OP
       2014-08-01 19:05:31 +08:00
    @raincious 非常感谢提供这么好的思路啊!
    alvin2ye
        13
    alvin2ye  
       2014-08-01 21:32:07 +08:00
    Jelen
        14
    Jelen  
       2014-08-01 22:43:00 +08:00
    xiparos
        15
    xiparos  
    OP
       2014-08-01 23:59:59 +08:00
    @Jelen 谢谢,这个刚刚有在看
    xiparos
        16
    xiparos  
    OP
       2014-08-06 21:29:14 +08:00
    @raincious 你好,有什么方法可以联系你,想请教关于PHP上消息提醒实现的一些问题。
    raincious
        17
    raincious  
       2014-08-06 21:55:49 +08:00
    @xiparos 你就这里问呗,可能我不知道的别人也知道呢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.