什么是检查服务器端更新的最小侵入性方法

时间:2016-07-18 05:10:48

标签: javascript php optimization xmlhttprequest

我有一个使用javascript File.ReadAllText(unicodeFileFullName, Encoding.Default); 连接到PHP脚本的Web应用程序 我试图检查服务器端何时发生变化。 我只能通过每秒向页面发送ping来检查,如

的javascript

????

PHP

xmlhttprequest

这对用户和服务器来说非常密集

这样更好吗

的javascript

function stayConnected(){
  setTimeout(function(){
    xmlhttp.send();
  },1000);
}

PHP

<?php
  if(update())echo "there's an update";
  flush();
?>

第二种解决方案对于观众来说似乎更好但是它对服务器有害吗? 我无法很好地检查服务器负载。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

这是我之前回答的转载from this board

您可以使用服务器已发送事件。流程如下:

  1. 每个用户订阅一个频道(将其视为在连接上注册事件监听器)。在服务器端,脚本连续运行以跟踪更改
  2. 用户向服务器发布更新。
  3. 脚本会注意到更新并发出事件
  4. 订阅该频道的所有客户都会收到该活动,阅读其data媒体资源并更新其本地模特。
  5. 参见this introduction,示例PHP实现。

    您也可以使用Web套接字。这是一个comparison of the two。在实施之前,请考虑browser compatibility

答案 1 :(得分:1)

您有几种选择:

轮询

这是您提到的第一个选项。客户端必须请求每x个时间单元请求更新。这导致许多请求。想想每秒要求更新的100个用户,这导致每分钟6000个请求。在许多情况下,请求会排队,而且不再是实时。

长轮询

这里客户端发送一个请求,并且在服务器上你有一个循环来检查更新(不知怎的,就像你的第二个例子)。一旦有更新,响应将立即发送。这导致许多并行线程来处理服务器。 100个用户制作100个帖子......

两种解决方案都不是最佳解决方案。相反,我们应该使用持久连接进行通信。

持久连接有两种选择:

Web套接字

WebSockets在客户端和服务器之间提供持久连接,双方可以使用该连接随时开始发送数据。最后这是一个事件循环,但你不必关心这个。优点是,这是另一种专门用于实时连接的协议! WebSockets是基于事件的,所以它只使用一个线程。

服务器已发送事件

它与WebSockets非常相似。您在客户端上打开到服务器的持久连接,但是通过HTTP。主要区别在于SSE连接只能将数据推送到客户端。

结论

所以在实践中:由于SSE可以完成的一切也可以通过WebSockets完成,并且浏览器对WebSockets的支持比SSE好得多,我认为这是最好的选择跟着去吧。 例如: IE / Edge支持WebSockets但不支持SSE

也许你可以使用 Ratchet 作为PHP的WebSockets框架: http://socketo.me/

但是我必须给你一个提示,即PHP不适用于繁重的实时应用程序。这是你的用例,也许你应该使用 node.js 作为后端,因为JavaScript自然是基于事件的,以适应这种用例。