每次mysql表刷新时刷新div

h7appiyu  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(428)

这个问题在这里已经有了答案

如何在php中不断刷新mysql查询((1个答案)
昨天关门了。
我有一个网站,这是一个消息传递应用程序。
目前,它通过读取refresh.php文件的输出,每500毫秒刷新一次。
我想知道是否有可能在每次“messages”表更新时调用refresh函数。
大多数答案包括settimeout或setinterval,但我只想在表更新时刷新它,因为上次我的网站因为主机服务器过载而被挂起。
聊天盒(index.php):

  1. <div id="chatbox">
  2. <?php
  3. if ($result = $mysqli->query("SELECT * FROM messages")) {
  4. while ($row = $result->fetch_assoc()) {
  5. echo formatMessageHTML($row["text"], $row["authorid"], $row["timestamp"], $row["hidden"], $mysqli);
  6. }
  7. $result->free();
  8. }
  9. ?>
  10. </div>

refresh.php

  1. <?php
  2. include_once "dbconnect.php";
  3. $mysqli = new mysqli("localhost", $username, $password, $database);
  4. if ($result = $mysqli->query("SELECT * FROM messages LIMIT 50")) {
  5. while ($row = $result->fetch_assoc()) {
  6. echo formatMessageHTML($row["text"], $row["edited"], $row["authorid"], $row["timestamp"], $row["hidden"], $mysqli);
  7. }
  8. }
  9. $result->free();
  10. function formatMessageHTML($text, $edited, $authorid, $timestamp, $hidden, $mysqli)
  11. {
  12. $html_message = "";
  13. if ($hidden == 1) return;
  14. 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>";
  15. if ($result = $mysqli->query("SELECT username, namecolor_fg, namecolor_bg FROM users WHERE id=" . $authorid)) {
  16. while ($row = $result->fetch_assoc()) {
  17. $tms = explode(":", $timestamp);
  18. unset($tms[2]);
  19. if($edited == 0) {
  20. $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>";
  21. } else {
  22. $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>";
  23. }
  24. }
  25. }
  26. return $html_message;
  27. }
  28. ?>

javascript(index.php):

  1. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
  2. <script>
  3. function loadLog() {
  4. console.log("[DEBUG] Refreshed chat");
  5. var oldscrollHeight = $("#chatbox")[0].scrollHeight - 20; //Scroll height before the request
  6. $.ajax({
  7. url: "refresh.php",
  8. cache: false,
  9. success: function(html) {
  10. $("#chatbox").html(html); //Insert chat log into the #chatbox div
  11. //Auto-scroll
  12. var newscrollHeight = $("#chatbox")[0].scrollHeight - 20; //Scroll height after the request
  13. if (newscrollHeight > oldscrollHeight) {
  14. $("#chatbox").animate({
  15. scrollTop: newscrollHeight
  16. }, 'normal'); //Autoscroll to bottom of div
  17. }
  18. }
  19. });
  20. }
  21. setInterval(loadLog, 500);
  22. </script>
nlejzf6q

nlejzf6q1#

您使用的是基于拉的数据模型,称为ajax轮询。为了避免不必要的请求,您可以使用长轮询,如下所述:https://stackoverflow.com/a/30259130/3980811
如果服务器仍然重载资源,可以考虑使用“基于推送”的数据模型。如果你想建立一个双向实时通信,比如聊天,你应该使用WebSocket。但它需要在服务器上进行额外的配置。
对于像“证券交易所”或“实时消息日志记录”这样的单向用例,您可以使用服务器发送的事件。它通过http协议运行,不需要额外的配置。
在这里您可以找到它们之间的比较:WebSocket与服务器发送事件/eventsource

相关问题