Как сделать запрос mysql постоянно refre sh в PHP? - PullRequest
2 голосов
/ 16 марта 2020

Я создаю базовый c чат. Мой код:

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

Каждый раз, когда вы обновляете sh страницу, это обновление и все записи, которые были добавлены с момента последнего обновления sh, добавляются в список. В чат-комнате это не идеально, так есть ли способ постоянно проверять наличие новых записей с минимальными помехами для пользователя? Спасибо!

1 Ответ

2 голосов
/ 16 марта 2020

Вы застряли в опросе с вашим текущим стеком технологий. MySQL не имеет никакого хорошего способа получить sh уведомление о том, что есть что-то новое, чтобы увидеть.

(Вы могли бы рассмотреть возможность добавления подсистемы очереди сообщений, например, RabbitMQ, но это требует больших изменений в структуре вашего приложения.)

Некоторые рекомендации по обработке опроса с наименьшей возможной стоимостью.

  1. Установите ожидания пользователей на несколько секунд ' задержка сообщений, а не миллисекунды.

  2. Запрашивайте столько раз, сколько необходимо для удовлетворения ожиданий задержки.

  3. Избегайте запросов большого количества данных с помощью каждый запрос. Как вы можете это сделать?

    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 последнюю отметку времени, чтобы вы могли доставлять новые необходимые элементы в браузер каждого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...