关于一个消息提醒的功能实现,请各位 V2Exer 帮忙解释一下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiparos
V2EX    问与答

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

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

    问题一:拿知乎举个栗子,(也可以是非死不可):用户登录后,只要自己关注的人有新状态发布,(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  
       201-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
    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     Solana     3004 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 00:31 PVG 08:31 LAX 17:31 JFK 20:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86