Нужно раз в секунду обращатся в базу данных и выводить данные на страницу?

Рейтинг: -2Ответов: 1Опубликовано: 10.03.2023

Нужно раз в секунду получать данные из бд и выводит их пользователю, как это можно сделать не отпровляя каждый раз post и не используя вебсокеты, sse

Ответы

▲ -1

Попробуйте использовать Лонг пуллинг, хоть и эта методика считается старой, но все ещё рабочей, ее смысл в том, что на сервере крутим бесконечный цикл, с клиента посылаем какой то запрос и держим отрытым соединение, если пришел ответ, отдаем его, закрываем соединение и по новой начинаем крутить цикл, думаю, вам стоит почитать про эту тему, тут, на пальцах не смогу объяснить, если нужно будет могу скинуть пример кода, который у меня на сервере отлично работает

пример кода js

 <script>
 function check(t){
     $.ajax({
     url: 'im.php',
     method: 'POST',
     data: { "ts": t, "wait": 20, "group_id": "group_id", "user_id": "user_id"},
       success: function(data){
       try {
          var d = JSON.parse(data);
          localStorage.setItem("ts", d.ts);
          if(d.w == 0) {
          $('#helppp').append(d.content);
          }
          setTimeout(check(d.ts), 100);
          } catch(error) {
             alert('Error parsing JSON:', error.message);
          }
          }
          });

          }
          var t = localStorage.ts;
          check(t);
</script>

php (сервер) файл im.php

<?php
require_once('assets/init.php');
// Последнее изменение файла
if(!isset($_POST['group_id'])){
    $data['ts'] = false;
    $data['content'] = 'error_group';

    json_encode($data);
    return;
}
function getLastModified()
{
    $ts_file = Wo_All_Chat_Select_Last_Time($_POST['group_id']);
    return $ts_file;
}

if ($_SERVER['REQUEST_METHOD'] == "POST") {

    $ts = $_POST['ts'];
    $wait = $_POST['wait'];

    if ($ts === "undefined") {
        $data['ts'] = getLastModified();
        $data['content'] = Wo_All_Chat_SelectLast($_POST['group_id'], $_POST['user_id']);
        echo json_encode($data);
        return;
    }

    // Текущее время плюс ожидание
    $w = (time() + $wait);

    // Крутим бесконечный цикл
    while (true) {

        // Проверяем изменение файла
        if ($ts < getLastModified()) {
            // Сразу возвращаем ответ если было изменение
            $data['ts'] = getLastModified();
            $data['content'] = Wo_All_Chat_SelectLast($_POST['group_id'], $_POST['user_id']);
            $data['w'] = 0;
            echo json_encode($data);
            return;
        }

        // Отдаем ответ после максимального ожидания
        if (time() >= $w) {
            $data['ts'] = getLastModified();
            $data['content'] = Wo_All_Chat_SelectLast($_POST['group_id'], $_POST['user_id']);
            $data['w'] = 1;
            echo json_encode($data);
            return;
        }

        // Спим секунду
        sleep(1);
    }

}


При сохранении сообщения использую поля id, user_id, text, time

Если нужно отправлять сообщение не перезагружая страницу, отправьте его тоже по аяксу, будет вам счастье