每次 MySQL table 刷新时刷新 div
Refresh div every time a MySQL table refreshes
我有一个消息传递应用程序网站。
目前,它通过读取 refresh.php 文件的输出每 500 毫秒刷新一次。
我想知道是否可以在每次 'messages' table 更新时调用刷新函数。
大多数答案都包括 setTimeout 或 setInterval,但我只想在 table 更新时刷新它,因为上次我的网站因主机服务器过载而暂停。
聊天框(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>
refresh.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>
您正在使用基于拉取的 数据模型,称为AJAX 轮询。为避免不必要的请求,您可以使用 long polling,如下所述:
如果服务器仍然资源过载,可以考虑使用“push-based”数据模型。
如果你想建立像聊天这样的双向实时通信——你应该使用 WebSockets。但它需要在服务器上进行额外的配置。
对于“证券交易所”或“实时消息记录”等单向用例,您可以使用服务器发送的事件。它通过 HTTP 协议运行,不需要附加配置。
在这里你可以找到它们之间的比较:
WebSockets vs. Server-Sent events/EventSource
我有一个消息传递应用程序网站。
目前,它通过读取 refresh.php 文件的输出每 500 毫秒刷新一次。
我想知道是否可以在每次 'messages' table 更新时调用刷新函数。
大多数答案都包括 setTimeout 或 setInterval,但我只想在 table 更新时刷新它,因为上次我的网站因主机服务器过载而暂停。
聊天框(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>
refresh.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>
您正在使用基于拉取的 数据模型,称为AJAX 轮询。为避免不必要的请求,您可以使用 long polling,如下所述:
如果服务器仍然资源过载,可以考虑使用“push-based”数据模型。 如果你想建立像聊天这样的双向实时通信——你应该使用 WebSockets。但它需要在服务器上进行额外的配置。
对于“证券交易所”或“实时消息记录”等单向用例,您可以使用服务器发送的事件。它通过 HTTP 协议运行,不需要附加配置。
在这里你可以找到它们之间的比较: WebSockets vs. Server-Sent events/EventSource