Javascript 检查服务器端更新的侵入性最小的方法是什么
我有一个web应用程序通过javascriptJavascript 检查服务器端更新的侵入性最小的方法是什么,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
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();
?>