我正在创建一个基本的聊天室。我的代码:
$conn = ("127.0.0.1","root","","mymessages");
$stmt = "SELECT * FROM posts ORDER BY timestamp LIMIT 100";
$result = mysqli_query($conn, $stmt);
if(!$result) {
echo("Query failed" . mysqli_error());
}
while ($row = mysqli_fetch_assoc($result)) {
$messagefname = $row['fname'];
$messagelname = $row['lname'];
$subject = $row['subject'];
$content = $row['content'];
$day = $row['day'];
$month = $row['month'];
$year = $row['year'];
$hour = $row['hour'];
$min = $row['minute'];
echo("<font size='1.5' face='Arial'>");
echo("Sent by " . $messagefname . " " . $messagelname . " at " . $hour . ":" . $min. " on " . $day . "/" . $month . "/" . $year . "<br>");
echo("</font><br><font size='4' face='Arial'><b>");
echo($subject);
echo("</font><br><font size='3' face='Arial'></b>");
echo($content);
echo("</font><br><br><hr><br>");
}
每次刷新页面时,此项都会更新,并且自上次刷新以来添加的所有记录都会添加到列表中。在聊天室里,这并不理想,所以有没有一种方法可以让用户在尽可能少的干扰下不断检查新记录?谢谢
您一直在使用当前的技术堆栈进行轮询。MySQL没有任何好的方法来向您推送有新内容要看的通知。
(您可以考虑添加一个消息队列子系统,例如RabbitMQ,但这需要对应用程序的结构进行重大更改(。
以尽可能低的成本处理轮询的一些指导原则。
-
将用户对消息延迟几秒的期望值设置为,而不是毫秒。
-
根据需要经常进行查询,以满足对延迟的期望。
-
避免每次查询都要查询大量数据。你怎么能那样做?
a。每当运行查询时,请保存最新的时间戳
b。不要使用
SELECT *
。相反,给出您实际需要的列的名称。这让MySQL的优化器可以帮助降低查询成本。c。让您的查询执行
SELECT whatever WHERE timestamp > saved_timestamp ORDER BY timestamp
,这样您就只能按顺序从表中获取新项目。如果您的系统不是很忙,这些SELECT通常不会返回任何行。这很好。d。请确保在时间戳和SELECT语句中的其他列上有多列索引。这被称为覆盖索引。
e。打开与MySQL的连接后,立即发出此SQL语句。它允许MySQL在与其他MySQL客户端将行插入到表的情况下,以较少的争用来获取数据。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
如果你在用户浏览器中使用AJAX,你需要在AJAX请求中包含最新的时间戳,这样你就可以向每个用户的浏览器提供新的、所需的新项目。