我正在制作一个基本的聊天室。我的代码:
$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 请求中包含最新时间戳,以便可以向每个用户的浏览器提供所需的新项目。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)