基于Ajax的实时信息提示(月影)
时间:2007-11-26
来源:互联网
关键字 B/S信息实时提示 Ajax
在笔者的一个B/S项目中,涉及到一个订单信息实时提示问题,客户对此实时提示的要求是:
当用户在远程下了一个订单的时候,那么在操作员的浏览器窗口上应该出现一个提示,告诉操作员有新订单,及时处理。
初次想到的就是:利用meta 定时刷新页面,但是在项目实际中,这是根本无法用的,原因如下:
一、页面每刷新一次,都得重新读取一次数据库,无形之中加大了数据库的负担;
二、刷新的时间间隔不能太长,否则,就达不到实时提示的要求;
三、每次刷新不一定能遇到有新订单产生的情况,也就是说:这些频繁的刷新,大多情况下,是没有新订单的;
四、当刷新时,必然会影响到操作员正在进行的工作--肯定是没法用的;
五、综合以上4点,于是决定用隐藏的框架,但是用隐藏的框架,前面三条的问题还是存在;
所以,定时刷新,是行不通的,后来,就借助Ajax,很好地完成了这个要求。但是先别急是怎么实现的,分析一下它内在的逻辑:
A事件:当远程用户下订单的时候―――>数据库产生一条新的订单记录
B事件:当操作员处理订单的时候―――>数据库新订单记录编辑
关键是A,如果我们在发生A事件的时候,能标记出它,那么,我们的客户端的Ajax再读取这个标记,不就可以实现了吗?事实上,实现原理就是这样的。
原理流程:
当远程用户下新订单的时候,数据库必然产生新的记录,这时用你的服务器端程序(ASP,PHP,JSP,CGI,ASP.NET均可)去建立一个文件(如htm格式,假设名字为new.htm),里面的内容自己随心写入就行;
然后,我们客户端的Ajax每隔一定时间(如20秒,或10秒)去读取上面建立的新文件new.htm ,如果发现这个文件的内容不为空,则表明有新订单生产,于弹出一个对话框,提示操作员“有新订单”之类的消息,于是,操作员便可以对这些订单处理。
当操作员处理完这些订单的时候,这里,就是没有新订单了,那么服务器端程序这里将上面的文件new.htm 内容清空。OK ,这时,如果没有新订单,客户端将永远不会有提示。
当然,利用Ajax有什么优点是不言而喻的,它在极大程度上减少了数据库的开销,只是在数据库发生改变的时候建立一个很小的文件,无论新订单如何多,操作员界面的信息提示永远不必直接读取数据库;
另外一方面,也极大地提高了系统的UI检验效果!何乐而不为?
说到这里,有人就要问了:如果有很多操作员,并且这些操作员处理不同部门的订单,如何做?--哈哈,更简单了,为每个部门的新订单建立新的标记文件就行了
类似的,像论坛的信息提示,订单实时提示,都可以用这个方法解决,不过这里的实时是有间隔的,反正这里不是导弹A-STA控制系统,有20秒的间隔延迟,也是完全可以的!
除非你要用Ajax开发导弹A-STA控制系统实时监控系统,那我是没办法的!
老考虑到代码,我就不在此发了,发出来,也只会让你看得头昏。所以,我提供一个演示地址:
这是模板一个会员管理系统,当有新会员注册时,管理员页面应该有提示
http://itzhiling.com/au/new.php 申请会员--模拟新用户注册
http://itzhiling.com/au/opt.htm 管理员操作页面--演示Ajax的提示效果
要注意到,这整个过程,页面是没有刷新的;使用方法,打开两个浏览器窗口,一个的地址栏输入http://itzhiling.com/au/new.php ,另外一个的地址栏输入http://itzhiling.com/au/opt.htm
,然后,在new.php 窗口中注册一个新用户,再注意opt.htm窗口中的提示信息!
当它提示有新用户注册时,点击OK,打开申核页面,申核后,点击上面的“关闭申核页面”,将不会有提示(除非又有人注册)。
文件包里的文件说明一下:
Ajax.js 自己封装的Ajax库
Class_access.php , global.config.php , gobal.func.php , global.inc.php 一些类库,函数库,可以不用看
New.php 新用户注册页面
Opt.htm 管理员页面
au.php 管理员申核页面
t.mdb 数据库文件,保存用户注册信息
[ 本帖最后由 xuer 于 2007-11-25 22:23 编辑 ]
作者: xuer 发布时间: 2007-11-25
作者: blankyao 发布时间: 2007-11-25
作者: eclanp 发布时间: 2007-11-25
作者: nywrb 发布时间: 2007-11-26

作者: MoHock 发布时间: 2007-11-26


作者: zjh00958 发布时间: 2007-11-26
作者: londit.cn 发布时间: 2007-11-26
作者: xiemengjun 发布时间: 2007-11-27
作者: xiangxubing 发布时间: 2007-11-27
作者: lshfong 发布时间: 2007-11-27
作者: chyoqin 发布时间: 2007-11-27
引用:
原帖由 lshfong 于 2007-11-27 17:09 发表服务器非得被你搞死不可
作者: xuer 发布时间: 2007-11-27

作者: muqiao 发布时间: 2007-11-27
我这几天恰好也准备做类似的功能,呵呵。
不错不错。
作者: BillyFan 发布时间: 2007-11-27
作者: dzjzmj 发布时间: 2007-11-27
作者: aoreal 发布时间: 2007-11-28

作者: wedypei 发布时间: 2007-11-28
作者: yufenglx 发布时间: 2007-11-28
引用:
原帖由 aoreal 于 2007-11-28 14:26 发表思路很好,但如果用户量非常大,有可能会比你直接用数据库更造成服务器负担。
你所说的,直接用数据库吗?那就也就是说,得每隔20秒刷新一次页面,那么在刷新页面的时候,就又得重新读取一次数据库,再重新加载整个页面,所以,整个服务器的负担是用Ajax几百倍以上
这个Ajax请求的文件很小,只有几个字节而已,Apache负载能力完全可以够用。
恳请高手提出更好的解决办法!
那么你的办法是什么呢?
作者: xuer 发布时间: 2007-11-29
作者: zhengdl126 发布时间: 2007-11-30
引用:
原帖由 zhengdl126 于 2007-11-30 14:11 发表别的方式应该还有。ECSHOP的定单处理,它用的服务器框架是用cpaint,具体的原理还没有研究过,楼主可以去下来看看。。。。8过,LZ的思路也可以,但是总感觉很牵强,应该还有更好的思路。。
作者: xuer 发布时间: 2007-12-01
作者: T.T.R 发布时间: 2007-12-01
引用:
原帖由 T.T.R 于 2007-12-1 12:57 发表触发器往临时表里写入基本信息,我想刷一个几十条数据的表,对于mysql来说很轻松吧,不必要建立文件,也没有必要通读整个数据表。楼主的代码看过,零散,思路简单应用还可以。

那么临时表建立好了,如何实时将这个信息通知级客户端?页面刷新?还是Ajax?还是隐藏框架?这个问题一直困扰着我,希解答为盼!不甚感激!
请大家给一个好的解决办法吧,最好带上演示
恳求各位高手出马解决!
[ 本帖最后由 xuer 于 2007-12-1 14:37 编辑 ]
作者: xuer 发布时间: 2007-12-01
二、刷新的时间间隔不能太长,否则,就达不到实时提示的要求;
三、每次刷新不一定能遇到有新订单产生的情况,也就是说:这些频繁的刷新,大多情况下,是没有新订单的;
四、当刷新时,必然会影响到操作员正在进行的工作--肯定是没法用的;
五、综合以上4点,于是决定用隐藏的框架,但是用隐藏的框架,前面三条的问题还是存在;
用ajax就解决了?
作者: phphp 发布时间: 2007-12-04
只读文件的最后修改时间!
作者: wangchun 发布时间: 2007-12-04
作者: wangchun 发布时间: 2007-12-04
引用:
原帖由 Lukin 于 2007-12-6 14:33 发表用$.getIfModified
只读文件的最后修改时间!
作者: Lukin 发布时间: 2007-12-06
作者: blue5tar 发布时间: 2007-12-06

谢谢!
作者: lwkyy 发布时间: 2007-12-08
引用:
原帖由 xuer 于 2007-12-1 14:33 发表这位朋友看来,没有看清楚我的文章所表达的意思

作者: learsu 发布时间: 2007-12-10

不错
作者: gdk2006 发布时间: 2007-12-11
引用:
原帖由 finian 于 2007-12-11 12:33 发表他的思路跟你是一样的,其实无非就是客户端轮询。只不过你用的是文件保存标志,他说的是用数据库。你用文件并不一定就能够比数据库更减轻服务器负担,相反,当连接数量大时,频繁的IO操作反而加重了服务器负担。 ...
我不敢承认你错,但是有异议.
而且你重新加载页面,那么当数据量比较大的时候,怎么办?还不是一样要加载一个体积很大的页面?服务器生成页面,难道就不用I/O操作了吗?
到底哪个方法更节省服务器资源,大家作过相应的测试吗?
我实在在知道这个答案,不过,有朋友做JQuery,来读文件的最后修改时间,我倒是觉得很可取的
欢迎大家踊跃参悟讨论!!!
[ 本帖最后由 xuer 于 2007-12-11 21:52 编辑 ]
作者: finian 发布时间: 2007-12-11
作者: 特蓝克斯 发布时间: 2007-12-11
作者: xuer 发布时间: 2007-12-11
作者: kupe 发布时间: 2007-12-14
引用:
原帖由 xuer 于 2007-12-11 21:47 发表读数据库就不用I/o操作了吗?,简直是无稽之谈,读数据库的过程就是:查询数据库+重新加载页面,重新加载页面,肯定得读页面文件对吧?读页面文件肯定就有I/O操作,对吧?那你怎么解释?
我不敢承认你错,但是 ...

作者: rebill 发布时间: 2007-12-15
作者: saso 发布时间: 2007-12-15
毛主席教导我们: 实践是检验真理的唯一标准,那么,你做出个例子来,再说明你的正确
我目前,不敢说你是错误的,只是在未经过你的实践证明之前,它是不会成为真理的
我也相信你通过事实,证明我是错的,而你是对的-----也只有这样,社会才有进步嘛
每个人的一小步,就是社会的一大步!!!
[ 本帖最后由 xuer 于 2007-12-16 02:21 编辑 ]
作者: finian 发布时间: 2007-12-15
作者: finian 发布时间: 2007-12-15
不过,我倾向于顶楼主,就数据库和文本而言,如果是从序列化数据层面来讲,database明显优于文本,但如果只是简单的判断及没有复杂的解析过程,数据库怎么可能比单纯的文本快?如果是这样,那为什么还要生成html,为什么还要做database cache?从底层结构来讲,我们可能把一些需要解析,并且有一定逻辑性的东西放到数据库里,但仅仅是取东西或者做判断状态,我顶楼主...
哈,一家之言,姑且听之笑之.
作者: xuer 发布时间: 2007-12-16
作者: emaili 发布时间: 2007-12-16
引用:
原帖由 xuer 于 2007-12-1 14:33 发表这位朋友看来,没有看清楚我的文章所表达的意思

10万条数据之内,mysql和mssql应该是没什么区别的,我们公司有一个电影站,有7万条数据,同时看电影的人有1000+人,没点一次播放就要刷数据库一次,而顾客看电影的实时进度也是要跟踪写入的,服务器本身没什么太大负担,cpu也不高,内存多点而已,你这个管理员也不至于1000人同时在线吧,ajax+1分钟刷新,没什么问题。
如果是做别的,那就另当别论了,就你现在这个项目,ajax实时刷新临时表根本就没什么问题,你实践了就知道了,具体项目具体分析,还有,不要以为写文件就没有什么大碍,频繁的读写文件对磁盘有很大影响。
作者: 无喱头 发布时间: 2007-12-16
缓存数据只保存新生成的订单数量,每生成一个订单,写缓存,订单数量加一;每次Ajax请求,读缓存,重设缓存为0,然后返回新订单数目。
这样不会有I/O操作,如果你乐意,甚至可以将新的订单信息写进缓存。
这是针对windows的memcache的扩展,根据php版本选择:
http://pecl4win.php.net/ext.php/php_memcache.dll
只要修改php.ini,加一条extension=php_memcache.dll就可以用了。
作者: qwl 发布时间: 2007-12-17
我想也是用楼主的方法..不过不同的我是用XML文件来存储聊天记录..用户每几秒就用AJAX读取那个XML文件,如果发现有新信息就写入到用户聊天界面,和楼主的应该都差不多吧...大家觉得真的会很耗服务器资源嘛?
还有,有朋友说用MYSQL的内存表来实现..怎么用呢???
作者: T.T.R 发布时间: 2007-12-17
作者: carche 发布时间: 2007-12-17
有人提议用网页的修改日期来标示,这需要服务器配置php的参数last_modified为1,并不是很可靠。
作者: wenfeng2 发布时间: 2007-12-17
我认为这个是一个脱裤子放屁的题目。(直白了……)
对于如此之小的操作而言,无论你使用数据库还是使用文件或者使用内存其实都根本没有所谓。完全不会对系统有任何负担。
从最纯粹的理论上说,可能楼主的方法系统占用率更低。毕竟不用打开SOCKET连接SOCKET然后MYSQL还要算一大堆指令才能出数据。
但是,但是啊,考虑到系统的可维护性还有整体的代码质量以及编程速度与质量,很明显使用数据库是最稳妥方便的办法。
我认为咱们都不是做单片机开发的,为了几个字节的内存要优化半天代码。在硬件资源没有任何问题的情况下,更多的应该考虑更加上层一些的东西。
大家说呢?
作者: xuer 发布时间: 2007-12-17
作者: carche 发布时间: 2007-12-17
作者: wangchun 发布时间: 2007-12-17
作者: qwl 发布时间: 2007-12-17
如果读数据库效率更高?那么为什么还要生成静态页面?
如果真这样说,那我看所有的新闻网站的都是猪头不成?
楼上,觉得你的办法好,但是你没有证明出来啊?楼主有例子,我也用它的方法,效果不错的,根本不会消耗服务器太多资源的
希望楼上能出你的方法的实例!!谢谢
[ 本帖最后由 chunhua 于 2007-12-18 22:56 编辑 ]
作者: T.T.R 发布时间: 2007-12-17
如果在做一些基于用户体验的功能设计时候 因为压力大 就必须考虑更多方法了
在压力大的情况下, 虽然说只不过几字节的文本, 但是IO操作频繁,用数据库也有弊端,所以就要好好权衡下了.
小弟还菜, 没啥好的建议,只是说下自己的感受.

作者: wangchun 发布时间: 2007-12-17
只是在产生新订单,申核新订单的时候写一下文件而已啊,其它Ajax请求的时候并没有写文件,只是读文件而已呀?
你们这些猪头,楼主的代码并没有频繁地写入文件呀?
作者: gleon 发布时间: 2007-12-18
我个人觉得主要干这个公司的规模,如果要是有上万人操作这个系统,估计那种方法都不好,如果要是很少人的话,操作数据库就可以了。
php本身就是用来快速开发的,所以如果不是很大规模的访问,还是越简单越好。呵呵
作者: ak-1 发布时间: 2007-12-18
以前遇到过这样的问题,但是一直没有想到很好的解决办法。跪谢了。

作者: wangchun 发布时间: 2007-12-18
作者: chunhua 发布时间: 2007-12-18
作者: zwws 发布时间: 2007-12-18
作者: chunhua 发布时间: 2007-12-19
作者: wangchun 发布时间: 2007-12-19
作者: donglong 发布时间: 2007-12-19
作者: hurrayboy 发布时间: 2008-01-09
作者: 小拨 发布时间: 2008-01-09
作者: fyp83 发布时间: 2008-01-10
1、自动刷新及频率问题
META、隐藏框架、AJAX都可以解决,刷新频率都可以控制。诚然AJAX要好得多。
2、刷新下载数据大小问题
META和隐藏框架是同步刷新,有用的没用的数据都得同步从服务器上再下一遍。AJAX只送出需要的查询下载需要的内容,数据量开销可以控制到很小。
3、数据存放形式问题
用数据库、内存表还是文件?数据表的话需要组织出未处理的条目形成一个视图(否则从N多数据中查询未被处理的几条,开销要考虑的。),内存表需要建一个(未处理条目)新表,用文件(XML会不会更好一点)则可以拎出未被处理的数据。个人认为以文件的形式要好一点。
BTW:俺水平有限,不敢班门弄斧,不过楼的的解决方案无疑是非常实用和优秀的。
作者: ct_174880859 发布时间: 2008-01-17
作者: 啊我好帅 发布时间: 2008-01-17
收藏了
作者: enjoyxp 发布时间: 2008-01-17
作者: qai41 发布时间: 2008-01-20
楼主的方法明显好于使用mysql 原因?
1。使用文本文件不需经过apache->php的加载,这一点非常重要,你们看看进程的内存消耗就明白php 动辄10M的内存是怎么没有的
2。使用mysql无论是内存表,还是i/o表,都需要使用php+mysql socket ,一次socket的消耗自己测一下就知道了,这都还不用谈到sql的执行(这点我倒是相信数据库比ext速度快)
3。谁说文件就无法使用内存?/dev/shm 干嘛用的?开动一下脑筋吗!
4。并发真的非常大可以考虑另外使用一个轻型的HTTP服务器,比如lighthttp
还有,一个思路得诞生,可能在低并发下没有用,但是,楼主可以考虑到高并发的某些需求,只能说思路更超前,程序人员开发程序的时候要眼光远一些!
作者: eltonto 发布时间: 2008-01-30
引用:
原帖由 xuer 于 2007-11-25 22:18 发表作者:月影 2007-11-25 于昆明
关键字 B/S信息实时提示 Ajax
当远程用户下新订单的时候,数据库必然产生新的记录,这时用你的服务器端程序(ASP,PHP,JSP,CGI,ASP.NET均可)去建立一个文件(如htm格式,假设名字为new.htm),里面的内容自己随心写入就行;
然后,我们客户端的Ajax每隔一定时间(如20秒,或10秒)去读取上面建立的新文件new.htm ,如果发现这个文件的内容不为空,则表明有新订单生产,于弹出一个对话框,提示操作员“有新订单”之类的消息,于是,操作员便可以对这些订单处理。
当操作员处理完这些订单的时候,这里,就是没有新订单了,那么服务器端程序这里将上面的文件new.htm 内容清空。OK ,这时,如果没有新订单,客户端将永远不会有提示。
[1] 如果同时有几个人下订单,同时对一个标志文件进行修改操作,会操作失败;
[2] 如果客户还有知道这时有几个新订单,当然也可以写在那个标志文件里。但是需要客户端JS分析。
[3] 处理完订单了,那么这个订单就不是新订单了,这时又需要去清空该标志文章,这这个时候,如果还有其它新的订单,没有办法判断。
……
我觉得 还是以AJAX直接返回数据新记录条数,这样虽然是操作了数据库了,但是流程应该会更清楚一些。
以上只是个人看法,抛砖引玉。
作者: semirmyway 发布时间: 2008-02-01
作者: 七月十五 发布时间: 2008-02-02


作者: analyzer 发布时间: 2008-02-07
引用:
原帖由 xuer 于 2007-12-11 21:47 发表读数据库就不用I/o操作了吗?,简直是无稽之谈,读数据库的过程就是:查询数据库+重新加载页面,重新加载页面,肯定得读页面文件对吧?读页面文件肯定就有I/O操作,对吧?那你怎么解释?
我不敢承认你错,但是 ...
[2] 如果客户还有知道这时有几个新订单,当然也可以写在那个标志文件里。但是需要客户端JS分析。
[3] 处理完订单了,那么这个订单就不是新订单了,这时又需要去清空该标志文章,这这个时候,如果还有其它新的订单,没有办法判断。
[ 本帖最后由 fearwall 于 2008-2-29 03:52 编辑 ]
作者: liuguoqing 发布时间: 2008-02-21
引用:
原帖由 fearwall 于 2008-2-29 03:43 发表[1] 如果同时有几个人下订单,同时对一个标志文件进行修改操作,会操作失败;
[2] 如果客户还有知道这时有几个新订单,当然也可以写在那个标志文件里。但是需要客户端JS分析。
[3] 处理完订单了,那么 ...
2。这个问题非常简单,作为通知文件,他仅仅用于标识数据库增量问题,至于具体内容,实际读取就行,这并不影响性能
作者: jzlacky 发布时间: 2008-02-24

作者: alxj 发布时间: 2008-02-24
作者: robinfu 发布时间: 2008-02-28
作者: joymenu 发布时间: 2008-02-28
作者: fearwall 发布时间: 2008-02-29
作者: fearwall 发布时间: 2008-02-29
作者: alxj 发布时间: 2008-03-01
作者: 二进制 发布时间: 2008-03-02
作者: opmetic 发布时间: 2008-03-02
不要动不动就。你这XXX我以前做过XXX。。。。
作者: siasford 发布时间: 2008-03-02
作者: siasford 发布时间: 2008-03-02
作者: siasford 发布时间: 2008-03-02
作者: hahajohn 发布时间: 2008-03-05
作者: yesin 发布时间: 2008-03-05
作者: cmttp 发布时间: 2008-03-06
引用:
原帖由 aoreal 于 2007-11-28 14:26 发表思路很好,但如果用户量非常大,有可能会比你直接用数据库更造成服务器负担。
作者: shher 发布时间: 2008-03-07
作者: yuanjing_119 发布时间: 2008-03-10
[ 本帖最后由 musicdu 于 2008-3-29 16:25 编辑 ]
作者: muyouyou 发布时间: 2008-03-11
引用:
原帖由 xuer 于 2007-12-16 02:17 发表还是麻烦楼上的仁兄给个例子吧,否则,我实在不敢苛同你的观点!-----我不能同意你说的每一个字,但是我誓死捍卫你说话的权力!
毛主席教导我们: 实践是检验真理的唯一标准,那么,你做出个例子来,再说明你的正确
我目 ...
数据库很大的情况,你这个就比较快。
作者: taohui 发布时间: 2008-03-11
然后用ajax读取表中纪录条数
两者想比较 怎么样啊
作者: kissweb 发布时间: 2008-03-14
作者: xiyuanwzq 发布时间: 2008-03-15
作者: 我要读书网 发布时间: 2008-03-28
作者: dongdonga 发布时间: 2008-03-29
作者: musicdu 发布时间: 2008-03-29
作者: wangcong83 发布时间: 2008-04-04
作者: tmsj008 发布时间: 2008-04-09
作者: lxydyx 发布时间: 2008-04-10
作者: yufenglx 发布时间: 2008-04-10

作者: c321net 发布时间: 2008-04-10
作者: haigang20000 发布时间: 2011-01-22
作者: jzhwin 发布时间: 2011-04-25
作者: andyshao 发布时间: 2011-05-26
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28