字体:  

PHP能不能实现反转Ajax?

peacock 发表于: 2008-9-29 13:14 来源: PHPChina 开源社区门户

举个例子,比如管理员需要在系统中发送一条公告信息,那么所有在线的用户可以立即获得这条信息,就像QQ一样,不需要客户端进行刷新。这就是反转Ajax,这个在java的Dwr中可以实现,PHP中好像没听说过,只知道PHP可以通过socket实现,不过难度很大,而且不稳定,具体的实现方法我也不是太了解。

最新回复

flash866 at 2008-9-29 14:06:15
没听说过,帮顶。
myBe at 2008-9-29 14:27:21
也想知道。这个功能很实用。
shanji at 2008-9-29 15:37:25
等高手
lxylxy888666 at 2008-9-29 15:41:24
同等
fyland at 2008-9-29 19:57:23
http是一种无状态的连接协议,所以不太可能实现楼主说的那样!
不过可以用javascript的setinterval来模拟,让客户端每隔一段时间(比如1秒)向服务器发送一次请求。
peacock at 2008-9-29 20:49:20

QUOTE:

原帖由 fyland 于 2008-9-29 19:57 发表
http是一种无状态的连接协议,所以不太可能实现楼主说的那样!
不过可以用javascript的setinterval来模拟,让客户端每隔一段时间(比如1秒)向服务器发送一次请求。
Dwr确实能实现这样的功能,不过好像是java上的,具体的我也不是很明白,只知道一些搞java的人在使用。

可以通过“dwr 反转ajax”搜索到很多的相关资料。
ljxok2001 at 2008-9-29 21:20:57
http 是基于 Request -> Response 模式通讯的, 也是说如果用户没有请求, 服务器就不能主动向用户提供操作.
要实现楼主所说的功能, 就必须让服务器与客户端一直保持通讯状态, 可以采用如下两个办法:
一个就是 6 楼所说的让客户端不停地提交刷新请求.
另一个就是 ajax 提交请求看是否有公告消息, 如果没有,那么服务器不作反应,保持通讯状态, 即xmlHttp.readyState=3, 然后在服务器端每隔一段时间检查一下是否有公告消息, 有则返回公告消息
peacock at 2008-9-29 22:26:22
AJAX推送方式与拉取方式的比较
使用Ajax可以开发出基于浏览器的具有高用户交互性和几乎不易觉察到延迟的web应用。实时的动态数据比如新闻标题、证券报价和拍卖行情都需要尽快地发送给用户。然而,AJAX仍然受限于web请求/响应架构的弱点,使得服务器不能推送实时动态的web数据。

  Delft科技大学的Engin Bozdag、Ali Mesbah和Arie van Deursen一起讨论了下面这些可以实现基于web的实时事件通知的方法:

  1.HTTP拉取方式:在这种传统的方法中,客户端以用户可定义的时间间隔去检查服务器上的最新数据。这种拉取方式的频率要足够高才能保证很高的数据精确度,但高频率可能会导致多余的检查,从而导致较高的网络流量。而另一方面,低频率则会导致错过更新的数据。理想地,拉取的时间间隔应该等于服务器状态改变的速度。

  2.HTTP流:这种方法由存在于不间断的HTTP连接响应中或某个XMLHttpRequest连接中的服务器数据流所组成。

  3.反转AJAX:服务流应用到AJAX,就是所谓的反转AJAX 或者COMET 。它使得服务器在某事件发生时可以发送消息给客户端,而不需要客户端显式的请求。目标在于达到状态变化的实时更新。COMET使用了HTTP/1.1中的持续连接的特性。通过HTTP/1.1,除非另作说明,服务器和浏览器之间的TCP连接会一直保持连接状态,直到其中一方发送了一条明显的“关闭连接”的消息,或者有超时以及网络错误发生。

  4.长时间轮询:也就是所谓的异步轮询,这种方式是纯服务器端推送方式和客户端拉取方式的混合。它是基于BAYEUX协议的。这个协议遵循基于主题的发布——订阅机制。在订阅了某个频道后,客户端和服务器间的连接会保持打开状态,并保持一段事先定义好的时间。如果服务器端没有事件发生,而发生了超时,服务器端就会请求客户端进行异步重新连接。如果有事件发生,服务器端会发送数据到客户端,然后客户端重新连接。
Sunyanzi at 2008-9-29 22:45:22
最简单的办法就是 socket 推送了 ...

或者一个 while (1) 的 php 文件 ... 通过 apache 调用 ...
myBe at 2008-9-29 23:41:07
这个比较有道理,只是怎样让服务端保持readyState=3呢?
496493722 at 2008-9-30 15:18:03
这个不好  那得让客户端不断的向服务器发出请求  这样会加重服务器的负担
szy_session1987 at 2008-9-30 16:43:40
不可能做到实时的, 服务器不可能受的了.
和聊天室差不多. 用 js 隔一个时间去请求一次服务器. 应该可以满足.
peacock at 2008-9-30 17:00:29
回答不可能的最好去搜下dwr和反转ajax或者COMET,由于本人没搞过java,所以对这方面不是太了解。
ljxok2001 at 2008-9-30 23:29:13

QUOTE:

原帖由 myBe 于 2008-9-29 16:41 发表
这个比较有道理,只是怎样让服务端保持readyState=3呢?
只要服务器不向客户端返回数据, 那么 ajax 中的 readyState=3, 也就是一直处于 Processing 状态,
可以设置 php 每隔若干秒钟检查一次是否存在公告消息, 有的话就回应客户端.
fei at 2008-10-01 21:10:30
很强大 不懂
hobbs136 at 2008-10-03 08:13:10

QUOTE:

原帖由 ljxok2001 于 2008-9-30 23:29 发表


只要服务器不向客户端返回数据, 那么 ajax 中的 readyState=3, 也就是一直处于 Processing 状态,
可以设置 php 每隔若干秒钟检查一次是否存在公告消息, 有的话就回应客户端.
你开玩笑吧,想一个链接就把服务器搞死啊,链接开的时间越长,占用的服务器端和客户端资源越多。我想目前还没有完美的服务器推送方案,必须用插件,或者自己有独立的客户端。如果可以推送,那就天下大乱了,那样的话,以后我就不敢上网浏览网页了。
joj_79 at 2008-10-03 08:56:38
9楼正解 目前无法完美实现~
suchasplus at 2008-10-03 10:32:46
http1.1长连接的话,apache撑不了太多吧
cwk32 at 2008-10-03 14:17:46
主要是在于,客户端是一直等着服务器可以继续发东西过来,还是说大概完了就把链接断了~
willko at 2008-10-04 15:25:05
有好的想法,但是目前并没有好的实现。。。