将数据推送到页面而不定期检查?
Posted
技术标签:
【中文标题】将数据推送到页面而不定期检查?【英文标题】:Push data to page without checking periodically for it? 【发布时间】:2012-07-09 03:14:39 【问题描述】:有什么方法可以将数据推送到页面而不是定期检查?
显然您可以使用 ajax 定期检查它,但是有什么方法可以在执行 php 脚本时强制页面重新加载?
理论上,您可以通过仅在应该执行 ajax 函数时使用表来提高 ajax 请求的速度(当 ajax 函数应该从数据库中检索新数据时更新表中的值),但这仍然需要相当大的即使没有更新/您不想执行检索数据库数据的 ajax 函数,查询执行时仍有一些等待时间。
有没有什么办法比查询数据库和检查存储“如果更新”数据的表或告诉 ajax 函数从另一个页面执行更有效?
我猜 node.js 或 html5 webSocket 也可能是一个可行的解决方案?
或者您可以将“如果更新”数据存储在文本文件中?欢迎提出任何建议。
【问题讨论】:
node.js 本身不是替代方案。 websockets 是。不过,您可以在 node.js 中使用 websocket 实现,就像使用许多其他服务器端技术一样。 您在标签中添加的哪些技术确实对您的问题起到了作用?以及哪个角色? 所有主要的服务器端技术现在都提出了 websockets。我至少见过 node.js、Go 和 java。而且我也见过 PHP,即使我不确定这对于已经在使用它的人来说是否有意义。 好吧,假设 javascript 是 node.js。所以一个标签是匹配的。关于 Go 和 java 我假设没有被问到。 【参考方案1】:您可以(或将会)使用 HTML5 套接字。
此页面包含有关此技术的一些重要信息:
http://www.html5rocks.com/en/tutorials/websockets/basics/
【讨论】:
听起来更像是评论而不是答案。找到,您的意思是,您刚刚找到它,或者您在不久前找到了它,使用了那里的信息并且它确实成功地为您工作? 我不同意。本来可以用更强烈的措辞听起来更权威,但霍根可能不想假设。 ;-) 对我来说,这是一个答案,不应该被否决。 “正确的技术是 websockets。它处于早期阶段。了解它。” 如果它有更好的跨浏览器支持我会的 错误,websockets? PHP 调用模型对 websocket 有用吗?错了?【参考方案2】:曾经有一种称为“服务器推送”的技术,它让一个 Web 服务器进程坐在那里等待脚本的更多输出,并在它出现时将其转发给客户端。这是 1995 年最热门的新技术,虽然您可能仍然可以这样做,但没有人这样做,因为这是一个非常糟糕的想法。
是的,你可以,但是当你到达那里时,你很可能希望你没有。
【讨论】:
@maxhud:每个客户端一个 HTTPD 进程,一直?你确定看到问题了吗? @chaos 有一个简单的解决方法。你去哪儿了? @Ohgodwhy:我猜是不关注与我的生活无关的事情。什么是简单的解决方法? @Ohgodwhy:简单的答案是在没有电脑的情况下在印度度过一年的假期。 @hakre 这是什么意思【参考方案3】:您基本上是在谈论通知客户端(即浏览器)服务器端事件。这实际上归结为两件事:
-
您使用的是什么网络服务器? (您是否仅限于特定语言?)
您需要支持哪些浏览器?
您最好的选择是使用 WebSockets 来完成这项工作,除了使用 web-sockets 之外的任何事情都是一种 hack。尽管如此,许多“hacks”都可以正常工作,我建议您尝试 Comet 或 AJAX 长轮询。
有一个名为Atmosphere(以及更多)的项目为您提供适合您正在使用的网络服务器的解决方案,然后会根据用户的浏览器自动选择最佳选项。
如果您不受浏览器的限制并且可以选择您的网络堆栈,那么我建议您使用SocketIO + nodejs。这只是我现在的偏好,WebSockets 仍处于起步阶段,一旦它开始发展,事情就会变得有趣。有时我的整个应用程序并不适合 nodejs,所以我将把数据操作单独卸载给它。
祝你好运。
【讨论】:
Socket.IO 有 WS 回退到许多浏览器(甚至是 IE5.5 socket.io/#browser-support),所以在实际情况下使用它很好。【参考方案4】:另一种可能性,如果您可以将数据以简单格式存储在文件中,您可以使用数据更新文件并使用 Web 服务器检查其时间戳。
然后浏览器可以轮询,发出 HEAD 请求,这将检查文件上的更新时间以查看它是否需要更新的副本。
这避免了对不更改数据的任何内容进行数据库调用,但会以保留重要资源的文件系统副本为代价。但是,如果您可以对活动数据执行此操作,并在一段时间后将它们滚下来,这可能是一个很好的权衡。您需要确保在任何更新数据的调用中都能更改此设置。
它与具有多个相同数据副本的任何系统共享同步风险,但如果增强的响应能力值得冒险,则可能值得调查。
【讨论】:
以上是关于将数据推送到页面而不定期检查?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Azure 将通知从 ASP.Net 页面推送到不同平台
UICollectionView 没有完全填满页面,当它们应该在一个页面上时,如何阻止它将项目推送到下一页?
在 Flutter 中 - 从 Web 浏览器中的 PayPal 完成交易页面返回后,如何将用户推送到应用程序中的“谢谢”页面