如何使 mysql 查询在 PHP 中不断刷新?

How to make a mysql query constantly refresh in PHP?

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

$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,但这需要对应用程序的结构进行重大更改)。

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

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

  2. 根据需要经常查询以满足延迟的预期。

  3. 避免每次查询都查询大量数据。你怎么做到的?

    一个。每当您 运行 查询

    时保存最近的时间戳

    b。不要使用 SELECT *。而是给出您实际需要的列的名称。这让 MySQL 的优化器有助于降低查询成本。

    c。让您的查询执行 SELECT whatever WHERE timestamp > saved_timestamp ORDER BY timestamp,这样您就只会按顺序从 table 中获取新项目。如果您的系统不是很忙,这些 SELECT 往往 return 没有行。不错。

    d。确保在时间戳和 SELECT 语句中的其他列上有一个多列索引。这称为 覆盖索引

    e。打开与 MySQL 的连接后,立即发出此 SQL 语句。它允许 MySQL 获取您的数据,而与其他 MySQL 客户端插入行到 table 的竞争较少。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

如果您在用户的浏览器中使用 AJAX 执行此操作,您希望在 AJAX 请求中包含最新的时间戳,以便您可以向每个用户的浏览器。