从服务器向所有客户端浏览器推送XML文件更新?

3
我想知道是否有可能从服务器向所有客户端浏览器推送XML文件更新?基本上,我的设想是,我的服务器保存一个XML文件,当用户加载使用该XML文件的页面时,他们可以请求更改它,如果更改被允许(由页面客户端决定),则在服务器端更新XML文件。到这一点我没问题(好吧,我还有很多阅读要做才能理解这一点)。然后,我希望所有连接的页面都可以刷新依赖于XML文件的所有元素,而无需刷新整个页面。
换句话说,所有那些使用该文件更新其副本->数据,如果服务器上的副本比他们的副本更新。通过服务器推送是否可能实现这一点,或者我必须不断轮询服务器以比较文件? (对我来说似乎很笨拙..)如果可能,最佳方法是什么?

感谢任何指向正确方向的指点。

2个回答

3
因为网页是无状态的,所以您无法将数据推送到它。您需要轮询服务器以获取更新。考虑一个小的ajax脚本,每5分钟轮询一次,当内容更新时,该脚本调用某些东西来更新页面。您需要大量使用ajax来完成此操作;使用jQuery或类似的库可以实现这一点。

谢谢您的快速回复,是否有可能每隔几秒钟轮询服务器,或者这会导致太多的减速? - tomatosource
不,你可以随时拉取/轮询,问题在于它有多有用,以及你是否拥有足够的资源与用户数量相比。如果你只有几个用户,每隔几秒钟轮询不会成为问题。但是,如果你的用户正在阅读一篇文章,你希望文章在他们阅读时改变吗?因此,在后一种情况下,5分钟的刷新时间更加合适。 - Prikkeldraad
您可能想查看长轮询。如果您有许多并发用户(许多打开的连接),则不完美。但对于更改的即时响应(如果这很重要)非常有效。 - Rudie
长轮询 - 这正是医生开的药方,谢谢。 - tomatosource
对于后来者,只是一个评论- 最好的方法是寻找长轮询Ajax聊天示例,非常容易找到。但我遇到了延迟问题,所以正在寻找其他解决方案。 - tomatosource

0

您可以尝试使用AJAX调用一些PHP脚本,例如:

set_time_limit(3600); // one hour or set it as long as your session timeout is
// Keep on repeating this to prevent PHP from stopping the script
while (true)
{
  sleep(5); //5 seconds between polling the server
  //do the updates xml updates
  flush();
  ob_flush();
}

连接将保持打开状态,每5秒钟将拉取xml并更新客户端。

如果您不想在数据未更改时花费大量时间和资源来拉取数据,则可以使用APC、memcache或任何其他服务器存储的变量,该变量会通知您XML已更改。

if(apc_fetch('xml_updated') == 1)
{
    //do the xml pull
}

你可以测试每秒钟尝试拉取数据时资源的使用情况。在我看来,最好有一个更大的延迟。

希望能帮到你!


1
只是提一下,这不是推送,而是拉取。推送是从服务器到客户端,服务器不知道它的客户端(没有打开的套接字,也没有人在远程端口上监听),因此它无法推送。只能由客户端从服务器拉取。 - Prikkeldraad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接