2012-04-15 58 views
3

我有一个网站需要发送通知到在线客户端实时与Facebook相同,经过多次搜索后,我发现了大量关于推拉技术的文档。我从这些文档中发现了使用Ajax或套接字实现它们的方法。我需要知道什么是最好的使用在我的情况下,它是如何编码使用JavaScript或jQuery和PHP。推拉技术使用Ajax或套接字

回答

0

只要使用应用使用jQuery的长轮询技术。

套接字尚未支持到处,也需要在服务器上打开一个监听套接字才能工作。

+0

是实时的长池支持。如何实施? – 2012-04-15 11:33:34

2

我不能说你最好在你的情况下使用什么,而不知道你的情况。

在大多数情况下,客户端每隔一两秒钟就会检查一次服务器,询问是否发生了新的事情。大多数时候我更喜欢使用套接字,因为它可以在任何Web服务器上运行,而无需进行任何配置更改,并且支持任何支持AJAX的浏览器,甚至是旧版本。

如果您的客户端很少(因为每个客户端都需要在服务器上打开一个套接字),并且您希望实时实时,则可以使用websocket。有几个PHP实现,例如这一个:http://code.google.com/p/phpwebsocket/

+0

我的情况与Facebook和Stackoverflow相同,当你回答我的问题时,它发送了我的通知,我需要做这样的事情,而我的网站预计会有很多用户。 – 2012-04-15 11:29:03

+0

如果你有像Facebook这样的“无限服务器能力”,我会选择带有替代解决方案的套接字用于旧版浏览器。 如果你不这样做,是否延迟一秒或更短(如果你愿意的话,你可以每隔250毫秒检查一次更新)对你的用户真正重要吗?如果是这样,请选择套接字。如果没有,请定期选择AJAX请求。 – 2012-04-15 11:41:36

2

如果您可以确保每个登录用户将只有一个浏览器打开,那么您可以轻松应用此长轮询技术。

政策AJAX调用:

  1. 不要要求每2秒。
  2. 但是等待请求后2秒才能获得前一个请求的响应。
  3. 如果一个请求在12秒内没有响应,那么不要等待发送新的请求。这是连接丢失的情况。

策略服务器响应:

  1. 是否有更新马上响应。根据会话检查是否有更新; (如果你能从客户端发送一些提示,比如收到最新消息,这个第二个更新检查机制将消除单个浏览器打开的限制,如上所述)

  2. 否则sleep(1秒; (不要使用无限循环但使用睡眠),然后检查是否有更新;如果更新有响应;如果不再睡1秒钟;重复这一点,直到总经过了10秒,然后用无更新回应回

如果应用此策略(俗称长轮询),你会发现处理器的使用在重负载下从95%降低到4%案件。

希望这解释。祝你好运。

+0

感谢您的回答,但还有另外一个问题是我如何检查更新,我使用的程序是每个用户在我的网站上都有一个页面;当用户添加,删除或更新他的页面时,我必须向页面追随者发送通知。我的数据库中有一张表用于保存通知。如你所说,为了获得更新,我需要每隔1秒访问数据库到服务器端以检查是否有更新。有没有另一种获取更新而无需访问数据库? – 2012-04-15 12:36:23

+0

您可以尝试使用文件锁定共享内存。但我希望你不要求,因为你大部分时间都在服务器端休眠,只有几秒钟才能唤醒你的查询。你的TCP握手需要比PHP处理更多的时间,这就是为什么我们使用这种长轮询技术,在每次握手之间等待很长时间(syn-fin)。 – 2012-04-15 12:51:40

+0

正在访问数据库每1秒代表数据库中的重负载?假设有1000个用户,这意味着1000数据库访问/秒 – 2012-04-15 13:05:13