我正在制作一个基本的聊天室。我的代码:$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>");}每次刷新页面时,此更新以及自上次刷新后添加的所有记录都会添加到列表中。在聊天室中,这并不理想,那么有没有办法让它不断检查新记录,同时尽可能少地对用户造成干扰?谢谢!
1 回答
子衿沉夜
TA贡献1828条经验 获得超3个赞
你被当前的技术栈卡住了。MySQL 没有任何好的方法可以向您推送有新内容可看的通知。
(您可以考虑添加一个消息队列子系统,例如 RabbitMQ,但这需要对应用程序的结构进行重大更改)。
以尽可能低的成本处理轮询的一些准则。
将用户期望设置为消息延迟几秒钟而不是毫秒。
尽可能频繁地查询以满足对延迟的期望。
避免每次查询都查询大量数据。你怎么能那样做?
一种。每次运行查询时保存最新的时间戳
湾。不要使用
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 请求中包含最新的时间戳,以便您可以向每个用户的浏览器提供所需的新项目。
添加回答
举报
0/150
提交
取消