首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

收藏此问题 发表新评论

基于Ajax的实时信息提示(月影)

作者:月影  2007-11-25 于昆明
关键字 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 22:18:00
收藏了!
昵称: blankyao  时间: 2007-11-25 22:28:00
不错~。。。先下了,等下看源码
昵称: eclanp  时间: 2007-11-25 22:46:00
收下了。。。。。。。。。。。。
昵称: nywrb  时间: 2007-11-26 13:21:00
昵称: MoHock  时间: 2007-11-26 13:21:00
,挺好的,收藏了,偷偷的笑笑
昵称: zjh00958  时间: 2007-11-26 13:47:00
强.............顶一下!
昵称: londit.cn  时间: 2007-11-26 21:11:00
你的思路很好,值得推荐,不错不错!支持你
昵称: xiemengjun  时间: 2007-11-27 11:44:00
借鉴了。.顶一下
昵称: xiangxubing  时间: 2007-11-27 14:45:00
服务器非得被你搞死不可
昵称: lshfong  时间: 2007-11-27 17:09:00
收藏
昵称: chyoqin  时间: 2007-11-27 17:24:00
引用:
原帖由 lshfong 于 2007-11-27 17:09 发表
服务器非得被你搞死不可
看�磉@��朋友�]有弄明白我的程序的思路,我的程序的思路就是最大程序�p少服�掌鞯呢��d,如果有普通的自�铀⑿马�面,你����吧,不停的�x�����欤�是什�N效果?
昵称: xuer  时间: 2007-11-27 18:12:00
昵称: muqiao  时间: 2007-11-27 19:30:00
顶一个,
我这几天恰好也准备做类似的功能,呵呵。

不错不错。
昵称: BillyFan  时间: 2007-11-27 20:01:00
很好,和我原来想法差不多,原来我做即时消息就是,如果某用户1向用户2发了消息就写一个1.txt的文件,ajax定时判断文件是否存在就取出消息数据后删除这个文件
昵称: dzjzmj  时间: 2007-11-27 20:59:00
思路很好,但如果用户量非常大,有可能会比你直接用数据库更造成服务器负担。
昵称: aoreal  时间: 2007-11-28 14:26:00
昵称: wedypei  时间: 2007-11-28 15:54:00
所藏了~~很强大
昵称: yufenglx  时间: 2007-11-28 17:31:00
引用:
原帖由 aoreal 于 2007-11-28 14:26 发表
思路很好,但如果用户量非常大,有可能会比你直接用数据库更造成服务器负担。
但是目前我还没有其它更好的解决办法 ?
你所说的,直接用数据库吗?那就也就是说,得每隔20秒刷新一次页面,那么在刷新页面的时候,就又得重新读取一次数据库,再重新加载整个页面,所以,整个服务器的负担是用Ajax几百倍以上

这个Ajax请求的文件很小,只有几个字节而已,Apache负载能力完全可以够用。

恳请高手提出更好的解决办法!

那么你的办法是什么呢?
昵称: xuer  时间: 2007-11-29 11:42:00
别的方式应该还有。ECSHOP的定单处理,它用的服务器框架是用cpaint,具体的原理还没有研究过,楼主可以去下来看看。。。。8过,LZ的思路也可以,但是总感觉很牵强,应该还有更好的思路。。
昵称: zhengdl126  时间: 2007-11-30 14:11:00
引用:
原帖由 zhengdl126 于 2007-11-30 14:11 发表
别的方式应该还有。ECSHOP的定单处理,它用的服务器框架是用cpaint,具体的原理还没有研究过,楼主可以去下来看看。。。。8过,LZ的思路也可以,但是总感觉很牵强,应该还有更好的思路。。
我也想找一个更好的方法,但是还没想到,如果你有好的方法,请及时发贴为盼,谢谢
昵称: xuer  时间: 2007-12-01 11:33:00
触发器往临时表里写入基本信息,我想刷一个几十条数据的表,对于mysql来说很轻松吧,不必要建立文件,也没有必要通读整个数据表。楼主的代码看过,零散,思路简单应用还可以。
昵称: T.T.R  时间: 2007-12-01 12:57:00
引用:
原帖由 T.T.R 于 2007-12-1 12:57 发表
触发器往临时表里写入基本信息,我想刷一个几十条数据的表,对于mysql来说很轻松吧,不必要建立文件,也没有必要通读整个数据表。楼主的代码看过,零散,思路简单应用还可以。
这位朋友看来,没有看清楚我的文章所表达的意思 ,我那个文章也没有说要读取整个数据表啊,“我想刷一个几十条数据的表,对于mysql来说很轻松吧”--这样页面不还是有刷新吗?一旦刷新,那么不就影响了操作员的当前操作?而且这样频繁刷新,对服务器也是一个不小的负担啊--因为它间隔时间比较短啊。

那么临时表建立好了,如何实时将这个信息通知级客户端?页面刷新?还是Ajax?还是隐藏框架?这个问题一直困扰着我,希解答为盼!不甚感激!

请大家给一个好的解决办法吧,最好带上演示
恳求各位高手出马解决!

[ 本帖最后由 xuer 于 2007-12-1 14:37 编辑 ]
昵称: xuer  时间: 2007-12-01 14:33:00
一、页面每刷新一次,都得重新读取一次数据库,无形之中加大了数据库的负担;
二、刷新的时间间隔不能太长,否则,就达不到实时提示的要求;
三、每次刷新不一定能遇到有新订单产生的情况,也就是说:这些频繁的刷新,大多情况下,是没有新订单的;
四、当刷新时,必然会影响到操作员正在进行的工作--肯定是没法用的;
五、综合以上4点,于是决定用隐藏的框架,但是用隐藏的框架,前面三条的问题还是存在;
用ajax就解决了?
昵称: phphp  时间: 2007-12-04 20:02:00
用$.getIfModified

只读文件的最后修改时间!
昵称: wangchun  时间: 2007-12-04 20:13:00
不错 不错
昵称: wangchun  时间: 2007-12-04 20:21:00
引用:
原帖由 Lukin 于 2007-12-6 14:33 发表
用$.getIfModified

只读文件的最后修改时间!
这位兄弟说的是用jQuery类来做,呵呵,确实很方便,有新消息只要向一个中间文件(比如a.txt)中写入,这样a.txt的时间就更新了,然后聊天的双方只要隔一定时间用$.getIfModified方法去读a.txt,看时间是变更,如果变更了就读
昵称: Lukin  时间: 2007-12-06 14:33:00
每个用户都有自己的独立XML文件,客户留言的同时向XML加一个节点,包括信息ID和添加时间,AJAX只读取XML节点状态进行判断。发现ID直接提示某个客户在什么时间给你留言点击直接用ID找到记录显示。读取后就删除这个节点。如果考虑I/O就把XML独立到单独服务器上,如果用户量太大就按字母和数字或者按时间进行分目录。
昵称: blue5tar  时间: 2007-12-06 15:13:00
收藏先,一会去看代码!
谢谢!
昵称: lwkyy  时间: 2007-12-08 16:26:00
引用:
原帖由 xuer 于 2007-12-1 14:33 发表
这位朋友看来,没有看清楚我的文章所表达的意思 ,我那个文章也没有说要读取整个数据表啊,“我想刷一个几十条数据的表,对于mysql来说很轻松吧”--这样页面不还是有刷新吗?一旦刷新,那么不就影响了操 ...
他的思路跟你是一样的,其实无非就是客户端轮询。只不过你用的是文件保存标志,他说的是用数据库。你用文件并不一定就能够比数据库更减轻服务器负担,相反,当连接数量大时,频繁的IO操作反而加重了服务器负担。这跟要尽量少使用session存储大数据的原理是一样的。
昵称: learsu  时间: 2007-12-10 10:10:00
  思路很清晰.
不错
昵称: gdk2006  时间: 2007-12-11 09:07:00
引用:
原帖由 finian 于 2007-12-11 12:33 发表


他的思路跟你是一样的,其实无非就是客户端轮询。只不过你用的是文件保存标志,他说的是用数据库。你用文件并不一定就能够比数据库更减轻服务器负担,相反,当连接数量大时,频繁的IO操作反而加重了服务器负担。 ...
读数据库就不用I/o操作了吗?,简直是无稽之谈,读数据库的过程就是:查询数据库+重新加载页面,重新加载页面,肯定得读页面文件对吧?读页面文件肯定就有I/O操作,对吧?那你怎么解释?
我不敢承认你错,但是有异议.
而且你重新加载页面,那么当数据量比较大的时候,怎么办?还不是一样要加载一个体积很大的页面?服务器生成页面,难道就不用I/O操作了吗?

到底哪个方法更节省服务器资源,大家作过相应的测试吗?

我实在在知道这个答案,不过,有朋友做JQuery,来读文件的最后修改时间,我倒是觉得很可取的
欢迎大家踊跃参悟讨论!!!

[ 本帖最后由 xuer 于 2007-12-11 21:52 编辑 ]
昵称: finian  时间: 2007-12-11 12:33:00
楼主写得很好,向你学习
昵称: 特蓝克斯  时间: 2007-12-11 21:26:00
先下了,等到了那水平再拿出来研究下!
昵称: xuer  时间: 2007-12-11 21:47:00
思路不错。AJAX新手,不懂其它方法,谢谢楼主的源码,我研究研究。
昵称: kupe  时间: 2007-12-14 13:41:00
引用:
原帖由 xuer 于 2007-12-11 21:47 发表
读数据库就不用I/o操作了吗?,简直是无稽之谈,读数据库的过程就是:查询数据库+重新加载页面,重新加载页面,肯定得读页面文件对吧?读页面文件肯定就有I/O操作,对吧?那你怎么解释?
我不敢承认你错,但是 ...
我faint,我有说读取数据库就不用I/O操作吗?这些都是基于文件系统的,怎么可能不用I/O?只不过比起纯粹的文件操作,数据库的效率肯定是高的,至少是经过优化了的,否则要数据库来干嘛。另外,你为什么就偏执地认为操作数据库就一定要重新加载页面呢?难道使用数据库就不能用ajax?ajax的使用根本就和你的data source无关,所以我才说你的思路和另外一位兄弟说的使用数据库是一样的,而且思路无非就是,客户端轮询。所以你data source用文件的话效率未必就比得上数据库。
昵称: rebill  时间: 2007-12-15 19:58:00
建议看看Http 1.1 Etag和Last-Modified
昵称: saso  时间: 2007-12-15 20:27:00
还是麻烦楼上的仁兄给个例子吧,否则,我实在不敢苛同你的观点!-----我不能同意你说的每一个字,但是我誓死捍卫你说话的权力!

毛主席教导我们: 实践是检验真理的唯一标准,那么,你做出个例子来,再说明你的正确

我目前,不敢说你是错误的,只是在未经过你的实践证明之前,它是不会成为真理的

我也相信你通过事实,证明我是错的,而你是对的-----也只有这样,社会才有进步嘛

每个人的一小步,就是社会的一大步!!!

[ 本帖最后由 xuer 于 2007-12-16 02:21 编辑 ]
昵称: finian  时间: 2007-12-15 23:42:00
不错,收藏先
昵称: finian  时间: 2007-12-15 23:45:00
讨论很激烈呀.哈哈...
不过,我倾向于顶楼主,就数据库和文本而言,如果是从序列化数据层面来讲,database明显优于文本,但如果只是简单的判断及没有复杂的解析过程,数据库怎么可能比单纯的文本快?如果是这样,那为什么还要生成html,为什么还要做database cache?从底层结构来讲,我们可能把一些需要解析,并且有一定逻辑性的东西放到数据库里,但仅仅是取东西或者做判断状态,我顶楼主...

哈,一家之言,姑且听之笑之.
昵称: xuer  时间: 2007-12-16 02:17:00
其实没有必要使用文件的。直接用数据库就可以了,如果觉得效率有问题,可以使用内存表解决问题。你的这个应用订单只是一个过度数据所以使用内存表没有任何问题。我曾经做过一个VOD点播系统,基于MYSQL的。使用内存表,20万条数据每秒钟被查询超过50次,毫无问题。相比压力应该比楼主大很多吧?
昵称: emaili  时间: 2007-12-16 21:52:00
引用:
原帖由 xuer 于 2007-12-1 14:33 发表


这位朋友看来,没有看清楚我的文章所表达的意思 ,我那个文章也没有说要读取整个数据表啊,“我想刷一个几十条数据的表,对于mysql来说很轻松吧”--这样页面不还是有刷新吗?一旦刷新,那么不就影响了操 ...
就这个项目而言,我是这样理解的:
10万条数据之内,mysql和mssql应该是没什么区别的,我们公司有一个电影站,有7万条数据,同时看电影的人有1000+人,没点一次播放就要刷数据库一次,而顾客看电影的实时进度也是要跟踪写入的,服务器本身没什么太大负担,cpu也不高,内存多点而已,你这个管理员也不至于1000人同时在线吧,ajax+1分钟刷新,没什么问题。

如果是做别的,那就另当别论了,就你现在这个项目,ajax实时刷新临时表根本就没什么问题,你实践了就知道了,具体项目具体分析,还有,不要以为写文件就没有什么大碍,频繁的读写文件对磁盘有很大影响。
昵称: 无喱头  时间: 2007-12-16 23:12:00
如果服务器是自己的,加一个memcache扩展,这样性能最高,数据直接缓存进内存。
缓存数据只保存新生成的订单数量,每生成一个订单,写缓存,订单数量加一;每次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 01:21:00
这是我自己写的聊天室 http://www.joymaple.com/myos.html (左上角按钮进入聊天室)
我想也是用楼主的方法..不过不同的我是用XML文件来存储聊天记录..用户每几秒就用AJAX读取那个XML文件,如果发现有新信息就写入到用户聊天界面,和楼主的应该都差不多吧...大家觉得真的会很耗服务器资源嘛?

还有,有朋友说用MYSQL的内存表来实现..怎么用呢???
昵称: T.T.R  时间: 2007-12-17 08:34:00
不要只说不做,咱们没必要在这里争论,你拿出实例来,才是最好的证明
昵称: carche  时间: 2007-12-17 11:28:00
想来想去还是楼主的办法可靠,无论是memcache还是数据库内存表,都需要Apache启动php解释引擎,楼主的办法可以避免脚本解析。而且楼主的要求不需要返回复杂数据,犯不着查询数据库。
有人提议用网页的修改日期来标示,这需要服务器配置php的参数last_modified为1,并不是很可靠。
昵称: wenfeng2  时间: 2007-12-17 13:45:00
读文件也要经过你说的这个步骤好吧……

我认为这个是一个脱裤子放屁的题目。(直白了……)

对于如此之小的操作而言,无论你使用数据库还是使用文件或者使用内存其实都根本没有所谓。完全不会对系统有任何负担。

从最纯粹的理论上说,可能楼主的方法系统占用率更低。毕竟不用打开SOCKET连接SOCKET然后MYSQL还要算一大堆指令才能出数据。

但是,但是啊,考虑到系统的可维护性还有整体的代码质量以及编程速度与质量,很明显使用数据库是最稳妥方便的办法。

我认为咱们都不是做单片机开发的,为了几个字节的内存要优化半天代码。在硬件资源没有任何问题的情况下,更多的应该考虑更加上层一些的东西。

大家说呢?
昵称: xuer  时间: 2007-12-17 14:30:00
LS正解~
昵称: carche  时间: 2007-12-17 16:01:00
还不错..
昵称: wangchun  时间: 2007-12-17 18:15:00
思路不错,比查数据库好多了!
昵称: qwl  时间: 2007-12-17 18:43:00
我觉得楼主是有道理的,要不,为什么新闻网站一般都要将新闻生成静态页面呢?

如果读数据库效率更高?那么为什么还要生成静态页面?

如果真这样说,那我看所有的新闻网站的都是猪头不成?

楼上,觉得你的办法好,但是你没有证明出来啊?楼主有例子,我也用它的方法,效果不错的,根本不会消耗服务器太多资源的

希望楼上能出你的方法的实例!!谢谢

[ 本帖最后由 chunhua 于 2007-12-18 22:56 编辑 ]
昵称: T.T.R  时间: 2007-12-17 18:56:00
倘若单用在后台管理 我认为楼主的方法可行

如果在做一些基于用户体验的功能设计时候 因为压力大 就必须考虑更多方法了

在压力大的情况下,  虽然说只不过几字节的文本, 但是IO操作频繁,用数据库也有弊端,所以就要好好权衡下了.

小弟还菜, 没啥好的建议,只是说下自己的感受.
昵称: wangchun  时间: 2007-12-17 21:42:00
楼主的方法并没有频繁的写文件操作呀,大家难道没有注意到吗?

只是在产生新订单,申核新订单的时候写一下文件而已啊,其它Ajax请求的时候并没有写文件,只是读文件而已呀?

你们这些猪头,楼主的代码并没有频繁地写入文件呀?
昵称: gleon  时间: 2007-12-18 10:12:00
都是讨论,意见不同,不用骂人啊,呵呵

我个人觉得主要干这个公司的规模,如果要是有上万人操作这个系统,估计那种方法都不好,如果要是很少人的话,操作数据库就可以了。

php本身就是用来快速开发的,所以如果不是很大规模的访问,还是越简单越好。呵呵
昵称: ak-1  时间: 2007-12-18 10:29:00
收藏了。
以前遇到过这样的问题,但是一直没有想到很好的解决办法。跪谢了。
昵称: wangchun  时间: 2007-12-18 12:38:00
zhichixia
昵称: chunhua  时间: 2007-12-18 22:49:00
支持顶下.不错
昵称: zwws  时间: 2007-12-18 22:58:00
...............................
昵称: chunhua  时间: 2007-12-19 16:15:00
收藏了!
昵称: wangchun  时间: 2007-12-19 17:30:00
不�e,收藏啦
昵称: donglong  时间: 2007-12-19 19:43:00
收藏了
昵称: hurrayboy  时间: 2008-01-09 19:35:00
MM哦。。
昵称: 小拨  时间: 2008-01-09 23:09:00
如果访问量大,服务器都会搞死,不过,思路不错。要顶!!
昵称: fyp83  时间: 2008-01-10 09:07:00
我认为楼主的解决方案很好,几个问题:

1、自动刷新及频率问题
META、隐藏框架、AJAX都可以解决,刷新频率都可以控制。诚然AJAX要好得多。

2、刷新下载数据大小问题
META和隐藏框架是同步刷新,有用的没用的数据都得同步从服务器上再下一遍。AJAX只送出需要的查询下载需要的内容,数据量开销可以控制到很小。

3、数据存放形式问题
用数据库、内存表还是文件?数据表的话需要组织出未处理的条目形成一个视图(否则从N多数据中查询未被处理的几条,开销要考虑的。),内存表需要建一个(未处理条目)新表,用文件(XML会不会更好一点)则可以拎出未被处理的数据。个人认为以文件的形式要好一点。

BTW:俺水平有限,不敢班门弄斧,不过楼的的解决方案无疑是非常实用和优秀的。
昵称: ct_174880859  时间: 2008-01-17 10:06:00
支持了,谢谢
昵称: 啊我好帅  时间: 2008-01-17 10:26:00
不错 支持一下
收藏了
昵称: enjoyxp  时间: 2008-01-17 17:29:00
强顶
昵称: qai41  时间: 2008-01-20 20:48:00
把8页都看完了。。
楼主的方法明显好于使用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 21:52:00
引用:
原帖由 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 ,这时,如果没有新订单,客户端将永远不会有提示。
让AJAX定时去读一个文件,虽然这时是减少的数据库操作,我觉得可以会有如下的问题产生:

   [1] 如果同时有几个人下订单,同时对一个标志文件进行修改操作,会操作失败;
   [2] 如果客户还有知道这时有几个新订单,当然也可以写在那个标志文件里。但是需要客户端JS分析。
   [3] 处理完订单了,那么这个订单就不是新订单了,这时又需要去清空该标志文章,这这个时候,如果还有其它新的订单,没有办法判断。
   ……

   我觉得 还是以AJAX直接返回数据新记录条数,这样虽然是操作了数据库了,但是流程应该会更清楚一些。

   以上只是个人看法,抛砖引玉。
昵称: semirmyway  时间: 2008-02-01 16:13:00
发邮件提醒怎么样?
昵称: 七月十五  时间: 2008-02-02 09:54:00
感觉不好
昵称: analyzer  时间: 2008-02-07 02:29:00
引用:
原帖由 xuer 于 2007-12-11 21:47 发表


读数据库就不用I/o操作了吗?,简直是无稽之谈,读数据库的过程就是:查询数据库+重新加载页面,重新加载页面,肯定得读页面文件对吧?读页面文件肯定就有I/O操作,对吧?那你怎么解释?
我不敢承认你错,但是 ...
[1] 如果同时有几个人下订单,同时对一个标志文件进行修改操作,会操作失败;
   [2] 如果客户还有知道这时有几个新订单,当然也可以写在那个标志文件里。但是需要客户端JS分析。
   [3] 处理完订单了,那么这个订单就不是新订单了,这时又需要去清空该标志文章,这这个时候,如果还有其它新的订单,没有办法判断。

[ 本帖最后由 fearwall 于 2008-2-29 03:52 编辑 ]
昵称: liuguoqing  时间: 2008-02-21 14:28:00
引用:
原帖由 fearwall 于 2008-2-29 03:43 发表


  [1] 如果同时有几个人下订单,同时对一个标志文件进行修改操作,会操作失败;
   [2] 如果客户还有知道这时有几个新订单,当然也可以写在那个标志文件里。但是需要客户端JS分析。
   [3] 处理完订单了,那么 ...
1 3 问题,可以用文件锁和等待轮训,当然也可以抛弃,因为,当文件有锁的时候放弃操作并不是不可行的。

2。这个问题非常简单,作为通知文件,他仅仅用于标识数据库增量问题,至于具体内容,实际读取就行,这并不影响性能
昵称: jzlacky  时间: 2008-02-24 13:35:00
很好的例子,感谢lz分享
昵称: alxj  时间: 2008-02-24 23:06:00
学习了,谢谢
昵称: robinfu  时间: 2008-02-28 14:50:00
好文章  说啥也得支持一下~~~
昵称: joymenu  时间: 2008-02-28 17:39:00
在顶一回不算多
昵称: fearwall  时间: 2008-02-29 03:32:00
我还顶
昵称: fearwall  时间: 2008-02-29 03:43:00
学习下
昵称: alxj  时间: 2008-03-01 15:04:00
看讨论很有收获,多谢大家
昵称: 二进制  时间: 2008-03-02 00:42:00
说得很清楚!
昵称: opmetic  时间: 2008-03-02 13:04:00
有异意的大虾们。拿出实例来说话啊。技术共享嘛
不要动不动就。你这XXX我以前做过XXX。。。。
昵称: siasford  时间: 2008-03-02 21:26:00
收藏了。谢谢楼主哦
昵称: siasford  时间: 2008-03-02 21:35:00
高人。
昵称: siasford  时间: 2008-03-02 21:37:00
有点意思
昵称: hahajohn  时间: 2008-03-05 10:36:00
学习啊 AJAX
昵称: yesin  时间: 2008-03-05 13:25:00
顶一下
昵称: cmttp  时间: 2008-03-06 23:05:00
引用:
原帖由 aoreal 于 2007-11-28 14:26 发表
思路很好,但如果用户量非常大,有可能会比你直接用数据库更造成服务器负担。
直接放内存里就行了。这样的标志性的东西不会占据太多空间。
昵称: shher  时间: 2008-03-07 13:33:00
学习了,不错.
昵称: yuanjing_119  时间: 2008-03-10 17:01:00
方法挺好,不过75楼说的很有道理,还有蛮多需要解决的问题。

[ 本帖最后由 musicdu 于 2008-3-29 16:25 编辑 ]
昵称: muyouyou  时间: 2008-03-11 21:32:00
引用:
原帖由 xuer 于 2007-12-16 02:17 发表
还是麻烦楼上的仁兄给个例子吧,否则,我实在不敢苛同你的观点!-----我不能同意你说的每一个字,但是我誓死捍卫你说话的权力!

毛主席教导我们: 实践是检验真理的唯一标准,那么,你做出个例子来,再说明你的正确

我目 ...
我觉得应该一分为二,如果数据库不大的情况,二者效率应该差不多。
数据库很大的情况,你这个就比较快。
昵称: taohui  时间: 2008-03-11 21:40:00
在php文件中保留纪录条数
然后用ajax读取表中纪录条数
两者想比较 怎么样啊
昵称: kissweb  时间: 2008-03-14 21:22:00
支持一下。
昵称: xiyuanwzq  时间: 2008-03-15 11:19:00
支持下~~学习
昵称: 我要读书网  时间: 2008-03-28 00:28:00
收藏了,学习一下
昵称: dongdonga  时间: 2008-03-29 13:48:00
原来月影是这里的人啊!叹……
昵称: musicdu  时间: 2008-03-29 16:13:00
好 东西,我 研究 了
昵称: wangcong83  时间: 2008-04-04 00:38:00
收藏了!谢了!!
昵称: tmsj008  时间: 2008-04-09 19:51:00
好,学习一下
昵称: lxydyx  时间: 2008-04-10 12:22:00
我看到不如在表单提交的时候用ajax调用后台的处理程序,按照原理这个程序肯定是即时调用的,那么也能即时显示信息~
昵称: yufenglx  时间: 2008-04-10 15:10:00
昵称: c321net  时间: 2008-04-10 15:18:00
如何下载源码呢
昵称: haigang20000  时间: 2011-01-22 22:28:05
好东西啊啊 定了
昵称: jzhwin  时间: 2011-04-25 10:51:39
怎么下载不了了?
昵称: andyshao  时间: 2011-05-26 12:29:21