Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查服务器端更新的侵入性最小的方法是什么_Javascript_Php_Optimization_Xmlhttprequest - Fatal编程技术网

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

Javascript 检查服务器端更新的侵入性最小的方法是什么,javascript,php,optimization,xmlhttprequest,Javascript,Php,Optimization,Xmlhttprequest,我有一个web应用程序通过javascriptxmlhttprequest 我正在尝试检查服务器端是否有更改。 我只能通过每秒向页面发送一个ping来检查,就像 javascript function stayConnected(){ setTimeout(function(){ xmlhttp.send(); },1000); } xmlhttp.onreadystatechange = function(){ if(server.xml.readyState == 4

我有一个web应用程序通过javascript
xmlhttprequest
我正在尝试检查服务器端是否有更改。 我只能通过每秒向页面发送一个ping来检查,就像

javascript

function stayConnected(){
  setTimeout(function(){
    xmlhttp.send();
  },1000);
}
xmlhttp.onreadystatechange = function(){
  if(server.xml.readyState == 4 &&
    server.xml.status == 200){
    doSomething(xmlhttp.responseText);
    xmlhttp.send();
  }
}
php

php


这是我先前答案的翻版

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

  • 每个用户订阅一个通道(将其视为在连接上注册事件侦听器)。在服务器端,脚本持续运行以跟踪更改
  • 用户向服务器发布更新
  • 脚本会注意到更新并发出一个事件
  • 订阅该频道的所有客户端都会接收该事件,读取其
    数据
    属性并更新其本地模型
  • 请参阅,附带示例PHP实现


    您还可以使用Web套接字。这是一本书。在实施之前,请考虑.< /P> < P>这是我之前回答的重写,

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

  • 每个用户订阅一个通道(将其视为在连接上注册事件侦听器)。在服务器端,脚本持续运行以跟踪更改
  • 用户向服务器发布更新
  • 脚本会注意到更新并发出一个事件
  • 订阅该频道的所有客户端都会接收该事件,读取其
    数据
    属性并更新其本地模型
  • 请参阅,附带示例PHP实现


    您还可以使用Web套接字。这是一本书。在实现这两种方法之前,请考虑.< /p> < p>您有几种选项:

    投票 这是你提到的第一个选择。客户端必须每x时间单位请求一次更新。这将导致许多请求。试想一下,每秒有100个用户请求更新,这导致每分钟有6000个请求。在许多情况下,请求会排队,不再是实时的

    长时间轮询 在这里,客户端发送一个请求,服务器上有一个检查更新的循环(类似于第二个示例)。一旦有更新,将立即发送响应。这导致服务器需要处理多个并行线程。100个用户生成100个线程

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

    持久连接有两个选项:

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

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

    结论 因此在实践中:由于使用SSE可以完成的所有事情也可以使用WebSocket完成,而且对WebSocket的浏览器支持比SSE好得多,因此我认为这是您可以使用的最佳选择。 例如:IE/Edge支持WebSocket,但不支持SSE

    也许您可以使用Ratchet作为WebSocket for PHP的框架:


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

    您有几个选项:

    投票 这是你提到的第一个选择。客户端必须每x时间单位请求一次更新。这将导致许多请求。试想一下,每秒有100个用户请求更新,这导致每分钟有6000个请求。在许多情况下,请求会排队,不再是实时的

    长时间轮询 在这里,客户端发送一个请求,服务器上有一个检查更新的循环(类似于第二个示例)。一旦有更新,将立即发送响应。这导致服务器需要处理多个并行线程。100个用户生成100个线程

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

    持久连接有两个选项:

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

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

    结论 因此在实践中:由于使用SSE可以完成的所有事情也可以使用WebSocket完成,而且对WebSocket的浏览器支持比SSE好得多,因此我认为这是您可以使用的最佳选择。 例如:IE/Edge支持WebSocket,但不支持SSE

    也许您可以使用Ratchet作为WebSocket for PHP的框架:

    但是我必须给你一个提示,PHP并不是为繁重的实时应用程序而设计的。这就是您的用例,也许您应该使用node.js作为后端,因为JavaScript自然是基于事件的,以适合此类用例<
    xmlhttp.onreadystatechange = function(){
      if(server.xml.readyState == 4 &&
        server.xml.status == 200){
        doSomething(xmlhttp.responseText);
        xmlhttp.send();
      }
    }
    
    <?php
      for( $i = 0; i < 120; i++){
        if(update()){
          echo "there's and update";
          break;
        }
        sleep(1000);
      }
      flush();
    ?>