首页 > 解决方案 > 如何在 PHP 中使 mysql 查询不断刷新?

问题描述

我正在制作一个基本的聊天室。我的代码:

$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>");
}

每次刷新页面时,此更新以及自上次刷新后添加的所有记录都会添加到列表中。在聊天室中,这并不理想,那么有没有办法让它不断检查新记录,同时尽可能少地对用户造成干扰?谢谢!

标签: javascriptphpmysqlajaxajax-polling

解决方案


你被当前的技术栈卡住了。MySQL 没有任何好的方法可以向您推送有新内容可看的通知。

(您可以考虑添加一个消息队列子系统,例如 RabbitMQ,但这需要对应用程序的结构进行重大更改)。

以尽可能低的成本处理轮询的一些准则。

  1. 将用户期望设置为消息延迟几秒钟而不是毫秒。

  2. 尽可能频繁地查询以满足对延迟的期望。

  3. 避免每次查询都查询大量数据。你怎么能那样做?

    一种。每次运行查询时保存最新的时间戳

    湾。不要使用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 请求中包含最新的时间戳,以便您可以向每个用户的浏览器提供所需的新项目。


推荐阅读