Javascript 使用web worker进行大厅更新(可能还有聊天)?

Javascript 使用web worker进行大厅更新(可能还有聊天)?,javascript,html,mysql,mariadb,web-worker,Javascript,Html,Mysql,Mariadb,Web Worker,我创建了一个网络版的棋盘游戏,并制作了一些可以让人们加入的大厅。 玩家加入大厅后,webworker()将启动并检查大厅中的当前玩家以显示他们 呼叫部分: <script> var w; function startWorker() { if (typeof(Worker) !== "undefined") { if (typeof(w) == "undefined") { //w = new

我创建了一个网络版的棋盘游戏,并制作了一些可以让人们加入的大厅。 玩家加入大厅后,webworker()将启动并检查大厅中的当前玩家以显示他们

呼叫部分:

<script>
    var w;

    function startWorker() {
        if (typeof(Worker) !== "undefined") {
            if (typeof(w) == "undefined") {
                //w = new Worker("demo_workers.js");
                w = new Worker("js/lobbyUpdater.js");
                w.postMessage(localStorage.groupID);
            }
            w.onmessage = function(event) {
                var response = JSON.parse(event.data);
                var player = response.player;
                var playerarry = player.split(":");
                document.getElementById("playerlist").innerHTML = "";
                var i = 0;
                for (i; i < response.playerCount; i++) {
                    var singleplayer = playerarry[i].split(",");
                    if (singleplayer[1] == localStorage.playerNumber) {
                        document.getElementById("playerlist").innerHTML += '<li><b>' + playerarry[i] + '</b></li>';
                    } else {
                        document.getElementById("playerlist").innerHTML += '<li>' + playerarry[i] + '</li>';
                    }
                }
                document.getElementById("currentPlayerAmount").innerHTML = response.playerCount;

                if (response.closed == 1) {
                    window.location.href = "playerpage.html";
                }

                console.log(event.data);
            };
        } else {
            document.getElementById("result").innerHTML = "Sorry, your browser does not support Web Workers...";
        }
    }

    function stopWorker() {
        w.terminate();
        w = undefined;
    }

    startWorker();

</script>
Webworker每1.5秒运行一次,但我认为这是非常常见的(每一轮都会在后端创建一个查询)

现在我考虑创建一个聊天室,玩家可以在这里相互交谈。为了接收消息,我考虑启动另一个webworker来检查消息

webworker的使用是否正常,或者我是否为此使用了一种“不需要的”技术。 有更好的解决办法吗

在后端使用如此频繁的sql查询会导致极端的性能峰值吗?当谈到“我的2c/4GB数据库服务器可以处理多少查询”时,我没有经验


提前谢谢

在我看来,最好的解决方案是使用WebSocket API。它允许您与服务器连接,然后服务器可以向客户端发送请求!因此,客户机不会向服务器发送检查请求的垃圾邮件,而且当某些内容发生变化时,他总是会获得新的信息

除Opera Mini外,每个现代浏览器都支持浏览器的WebSocket API:

集成客户端非常容易。关于服务器端——我并没有尝试用PHP创建WebSocket连接,所以对此我不能说太多


另一种解决方案可能是Firebase实时数据库。在那里你可以阅读有关它的教程:

谢谢你的回答!我检查了一些网站,似乎可以使用php()构建websocket连接。我会看看我是否能实现这一点。
function updateLobby(groupID) {


    var Http = new XMLHttpRequest();
    var url = '../php/checkLobby.php';

    var preGroupID = '?groupID=';


    url = url.concat(preGroupID, groupID);

    Http.open("GET", url);
    Http.send();

    Http.onreadystatechange = (e) => {
        //console.log(Http.responseText)
        postMessage(Http.responseText);
    }

    var string = "updateLobby('";

    string = string.concat(groupID, "')");

    setTimeout(string, 1500);
}


onmessage = function (e) {
    var groupID = '';
    groupID = e.data;
    updateLobby(groupID);
};