【问题标题】:How to make a mysql query constantly refresh in PHP?如何在 PHP 中使 mysql 查询不断刷新?
【发布时间】:2020-06-27 19:27:25
【问题描述】:

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

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

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

【问题讨论】:

  • 您将需要查看 javascript 和 ajax 请求,这些请求将按您指定的时间间隔轮询查询脚本

标签: javascript php mysql ajax ajax-polling


【解决方案1】:

您无法使用当前的技术堆栈进行轮询。 MySQL 没有任何好的方法可以向您推送有新内容可看的通知。

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

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

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

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

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

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

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

    c。让您的查询执行SELECT whatever WHERE timestamp &gt; saved_timestamp ORDER BY timestamp,这样您就只能按顺序从表中获取新项目。如果您的系统不是很忙,这些 SELECT 通常不会返回任何行。这很好。

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

    e。打开与 MySQL 的连接后,立即发出此 SQL 语句。它可以让 MySQL 获取您的数据,而不会与其他向表中插入行的 MySQL 客户端争用。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

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

【讨论】:

  • 我知道这对使用的影响很小,但是我怎样才能让查询自己重复呢?
猜你喜欢
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 2014-04-23
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2023-03-23
相关资源
最近更新 更多