gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:24:04 25 4
gpt4 key购买 nike

我有一个使用 javascript xmlhttprequest 连接到 PHP 脚本的 Web 应用程序我正在尝试检查服务器端何时发生变化。我只能通过每秒向页面发送 ping 来进行检查,例如

JavaScript

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

php

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

这对于用户和服务器来说都是非常密集的

这样更好吗

JavaScript

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

php

<?php
for( $i = 0; i < 120; i++){
if(update()){
echo "there's and update";
break;
}
sleep(1000);
}
flush();
?>

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

最佳答案

您有多种选择:

轮询

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

长轮询

这里客户端发送一个请求,并且在服务器上您有一个检查更新的循环(类似于您的第二个示例)。一旦有更新,将立即发送回复。这会导致服务器需要处理许多并行线程。 100 个用户产生 100 个线程……

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

持久连接有两个选项:

网络套接字

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

服务器发送事件

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

结论

所以在实践中:由于使用 SSE 可以完成的所有操作也可以使用 WebSocket 完成,并且浏览器对 WebSockets 的支持比 SSE 好得多,所以我认为这是最好的选择一起去。例如:IE/Edge 支持 WebSockets,但不支持 SSE

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

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

关于javascript - 检查服务器端更新的侵入性最小的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38428980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com