每次 MySQL 表刷新时刷新 div [重复]

Posted

技术标签:

【中文标题】每次 MySQL 表刷新时刷新 div [重复]【英文标题】:Refresh div every time a MySQL table refreshes [duplicate] 【发布时间】:2021-10-01 21:32:46 【问题描述】:

我有一个网站,它是一个消息应用程序。

目前,它通过读取 refresh.php 文件的输出每 500 毫秒刷新一次。

我想知道是否可以在每次“消息”表更新时调用刷新函数。

大多数答案包括 setTimeout 或 setInterval,但我只想在表更新时刷新它,因为上次我的网站因主机服务器超载而暂停。

聊天框(index.php):



            <div id="chatbox">
                <?php


                if ($result = $mysqli->query("SELECT * FROM messages")) 
                    while ($row = $result->fetch_assoc()) 

                        echo formatMessagehtml($row["text"], $row["authorid"], $row["timestamp"], $row["hidden"], $mysqli);
                    
                    $result->free();
                
                ?>
            </div>

刷新.php


<?php

include_once "dbconnect.php";
$mysqli = new mysqli("localhost", $username, $password, $database);

if ($result = $mysqli->query("SELECT * FROM messages LIMIT 50")) 
    while ($row = $result->fetch_assoc()) 
            echo formatMessageHTML($row["text"], $row["edited"], $row["authorid"], $row["timestamp"], $row["hidden"], $mysqli);
        
        
    
    $result->free();

function formatMessageHTML($text, $edited, $authorid, $timestamp, $hidden, $mysqli)


    $html_message = "";
    if ($hidden == 1) return;
    if (!isset($text) || !isset($authorid) || !isset($timestamp)) return "<div class='msgln'><span class='chat-time'>" . date("g:i A") . "</span> <a class='taglink' href='javascript:insert_mention(\"Unknown\");'><b class='user-name'>Unknown</b></a> Unknown<br></div>";
    if ($result = $mysqli->query("SELECT username, namecolor_fg, namecolor_bg FROM users WHERE id=" . $authorid)) 
        while ($row = $result->fetch_assoc()) 
            $tms = explode(":", $timestamp);
            unset($tms[2]);
            if($edited == 0) 
                $html_message = "<div class='msgln'><span class='chat-time'>" . join(":", $tms) . "</span> <a class='taglink' href='javascript:insert_mention(\"" . $row["username"] . "\");'><b class='user-name' style='color: " . $row["namecolor_fg"] . "; background-color: " . $row["namecolor_bg"] . "'>" . $row["username"] . "</b></a> " . $text . "<br></div>";
             else 
                $html_message = "<div class='msgln'><span class='chat-time'>" . join(":", $tms) . "</span> <a class='taglink' href='javascript:insert_mention(\"" . $row["username"] . "\");'><b class='user-name' style='color: " . $row["namecolor_fg"] . "; background-color: " . $row["namecolor_bg"] . "'>" . $row["username"] . "</b></a> " . $text . " <span class='edited'>(edited)</span><br></div>";
            
            
        
    

    

    return $html_message;


?>

Javascript (index.php):


<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

<script>
                function loadLog() 
                    console.log("[DEBUG] Refreshed chat");
                    var oldscrollHeight = $("#chatbox")[0].scrollHeight - 20; //Scroll height before the request

                    $.ajax(
                        url: "refresh.php",
                        cache: false,
                        success: function(html) 
                            $("#chatbox").html(html); //Insert chat log into the #chatbox div

                            //Auto-scroll           
                            var newscrollHeight = $("#chatbox")[0].scrollHeight - 20; //Scroll height after the request
                            if (newscrollHeight > oldscrollHeight) 
                                $("#chatbox").animate(
                                    scrollTop: newscrollHeight
                                , 'normal'); //Autoscroll to bottom of div
                            
                        
                    );
                

                setInterval(loadLog, 500);
</script>

【问题讨论】:

这能回答你的问题吗? How can I tell when a MySQL table was last updated? 作为更方便的方式,你可以了解一下web socket。 你想要的是服务器推送,但是 mysql 不适合这个目的,因为它没有通知功能。如果这是您想要的,您需要使用消息队列或事件桥解决方案认真返工您的后端。 【参考方案1】:

您正在使用 基于拉动的数据模型,称为 AJAX 轮询。为避免不必要的请求,您可以使用 long polling,如下所述: https://***.com/a/30259130/3980811

如果服务器仍然资源过载,可以考虑使用“基于推送”的数据模型。 如果您想构建双向实时通信,例如聊天 - 您应该使用 WebSockets。但它需要在服务器上进行额外配置。

对于“证券交易所”或“实时消息记录”等单向用例,您可以使用服务器发送事件。它通过 HTTP 协议运行,不需要额外配置。 p>

您可以在这里找到它们之间的比较: WebSockets vs. Server-Sent events/EventSource

【讨论】:

mysql都不支持这些,所以你的答案不完整。 @Shadow JavaScript 和 PHP 都支持,所以你的评论没用。 问题是:当mysql中的数据被刷新时如何更新网页,因此mysql不能使用这些技术的事实是相关的。 我思想开放,但您需要从问题的角度来构建您的答案。我确定 OP 不知道要使用什么技术进行实时消息传递,这就是为什么您需要说明 mysql 对此并不真正适用的原因。使用 mysql 你只能使用轮询。 感谢您的宝贵时间,但我们找不到通用语言。

以上是关于每次 MySQL 表刷新时刷新 div [重复]的主要内容,如果未能解决你的问题,请参考以下文章

session_start() 每次刷新都会创建新会话 [重复]

Rails 页面在每次刷新时更改翻译

每次按下刷新按钮时DataGridView都会重复vb.net

如何避免 BigQuery 中的 Power BI 增量刷新重复查询?

JQUERY刷新DIV后我的JS函数不起作用[重复]

使用jQuery .load函数刷新元素而不重复它