如何每隔几秒在 php 中刷新具有打印语句和图像功能的 div

how to refresh a div with a function of print statements and images in php every few seconds

我正在尝试构建一个浏览器纸牌游戏,主要使用 PHP 和一些其他有用的语言来测试和扩展我的 PHP 知识,以及我一直想做的东西。但是我阅读并尝试实施的所有在线解决方案都行不通,而且我也不知道为什么。我有这样的逻辑:

//find game form
        print "<form method='post' action='game.php'>
        <label>Enter host generated game #</label><br>
        <label><input type='text' name='gamenumber'></label><br>
        <label><input type='submit' name='findgame' value='FindGame'></label><br><br>
        </form>";

        //host game button
        print "<form method='post' action='game.php'>
        <label><input type='submit' name='hostgame' value='HostGame'></label>
        </form>";

//game logic



if(isset($_POST['hostgame'])) 
    {
        $roomnumber = rand();
        print $roomnumber;

        insertField($Ausername,$roomnumber); //insert field GUI

        //link game to host for future field printing
        $query = "UPDATE game".$roomnumber." SET host='".$Ausername."' WHERE host='null'";
        $result = mysqli_query($link, $query);

        print "<div id='quote'>"; //populate host just disappears <meta http-equiv='refresh' content='5' />

        //populates self and opponents in hosts perspsective
        populatehost($roomnumber); 

        print "</div>";


    }

    if(isset($_POST['findgame'])) //this processes after user submits data.
    {
        $roomnumber = $_POST['gamenumber'];
        $_SESSION['gamenumber'] = $_POST['gamenumber'];

        //link game to find for future field printing
        $query = "UPDATE game".$roomnumber." SET find='".$Ausername."'WHERE find='null'";
        $result = mysqli_query($link, $query);

        print "<form method='post' action='game.php'>
        <label><input type='submit' name='startgame' value='StartGame'></label>
        </form>";

        //populates self and opponents in finds perspsective
        populatefind($roomnumber); 

    }


    if(isset($_POST['startgame'])) //this processes after user submits data.
    {
        print "<br>Game started.<br>";

        print "heads or tails?\n\n";

        print "<form method='post' action='game.php'>
        <label><input type='text' name='headstails'></label><br>
        <label><input type='submit' name='select' value='Select'></label><br><br>
        </form>";

        //finder always starts game
        populatefind($_SESSION['gamenumber']);
    }

    $gameStatus="";
    $flip = rand(1,2);
    $coin = "heads";
    $gameStarted = "game not started";

    if($flip==1)
        $coin="heads";
    else if($flip==2)
        $coin="tails";

    if(isset($_POST['headstails'])) //this processes after user submits data.
    {
        if($_POST['headstails']==$coin)
        {
            print "find game player goes first";
            $gameStarted = "game started";
            //notify find game player he goes first
            //do logic where he goes first
        }
        else
        {
            print "host game player goes first";
            $gameStarted = "game started";
            //notify host game player he goes first
            //do logic where he goes first
        }

        populatefind($_SESSION['gamenumber']);
    }

这是我尝试粘贴在页面底部的 jquery 函数。

?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js%22%3E%3C/script%3E">
    jQuery(function () {
        var $els = $('div[id^=quote]'),
            i = 0,
            len = $els.length;

        $els.slice(1).hide();
        setInterval(function () {
            $els.eq(i).fadeOut(function () {
                i = (i + 1) % len
                $els.eq(i).fadeIn();
            })
        }, 2500)
    })
</script>

</body>
</html>

所以我能够为主持人和发现者打印该字段,并且一旦发现者抛硬币,它就会说从他们的角度来看谁先走..但是我很难让它出现在其他玩家的视角。我正在考虑通过使用执行所有打印的功能刷新 div 来实现它,但无论如何似乎都没有用。我以多种不同的方式尝试了 php 睡眠方法,我尝试了一些 jquery 函数,但没有任何效果。顺便说一下,populate host 和 populate find 只是具有基于变量数组的巨型表的函数。

您尝试实现的这类事情会使用常规 Ajax 调用消耗服务器的大量资源。

类似问题:Link

让我们以两个用户之间的聊天为例:

用户的 1 页面有一个 Java脚本计时器每秒询问新消息:"hey server, send me new messages." 无论是否有新消息,服务器都会处理请求,搜索新消息回复"I've got no messages for you right now""here is your new message"。 用户 2 相同。

如果两个用户保持聊天页面打开 10 秒,您的服务器将收到 20 条新消息请求,运行 20 次搜索新消息并发送 20 条新消息回复或"no new messages"回复。即使两个用户都没有发送任何内容,只是保持页面打开。想象一下,如果有 1000 个用户连接到您的聊天室!

这种情况下最好的方法是 Socket。在同一个聊天示例中,用户 1 和用户 2 将继续收听新消息,而不是每秒询问一次。当用户1发送消息时,服务器会通知用户2"I have a new message for you. Here is."

如果连接1000个用户,完全没有问题。服务器会将新消息发送到套接字通道,并通知所有连接的用户。没有延迟。

在您的特定情况下,将像这样工作:播放器 1 和播放器 2 正在侦听新消息。当玩家 1 点击卡片时,将触发服务器命令。服务器将接收和发送套接字通道的消息:"hey everyone who is awaiting for new cards, here is" 然后每个玩家都会收到通知。即刻。

第一个场景的另一个问题,使用 Java 脚本计时器:如果您增加计时器间隔,回复将延迟传递。

套接字的另一个好处是:它独立于技术。 PHP、Java、节点等

GitHub 将 WebSocket 与 Php 一起使用的项目:Link

You can see some socket demos here

Here is a repository with some tests I ran when I tried Socket earlier

你可以这样做:

setInterval(function refresh(){
  var value = Math.round(Math.random()*100);
  $("#target").addClass("hidden");
  $("#target").html(value);
  $("#target").removeClass("hidden");
}
, 1500);
.hidden {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="target">
</div>