xiparos
V2EX  ›  问与答

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

  •  
  •   xiparos · Aug 1, 2014 · 4676 views
    This topic created in 4330 days ago, the information mentioned may be changed or developed.
    可能问题有些低级,但是我实在没做过这方面的功能实现,还恳请各位高手轻喷。

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

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

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

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

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

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

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

    我这是Ajax轮询实现的。

    WebSocket的话建议直接写一台通讯服务器,不然负担不小。
    xiparos
        12
    xiparos  
    OP
       Aug 1, 2014
    @raincious 非常感谢提供这么好的思路啊!
    alvin2ye
        13
    alvin2ye  
       Aug 1, 2014
    Jelen
        14
    Jelen  
       Aug 1, 2014
    xiparos
        15
    xiparos  
    OP
       Aug 1, 2014
    @Jelen 谢谢,这个刚刚有在看
    xiparos
        16
    xiparos  
    OP
       Aug 6, 2014
    @raincious 你好,有什么方法可以联系你,想请教关于PHP上消息提醒实现的一些问题。
    raincious
        17
    raincious  
       Aug 6, 2014
    @xiparos 你就这里问呗,可能我不知道的别人也知道呢。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3429 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 11:38 · PVG 19:38 · LAX 04:38 · JFK 07:38
    ♥ Do have faith in what you're doing.