Обновление чата на php

На данный момент чат работает отправляя раз в секунду запрос на обновление всех данных в окошке чата: сообщения, имена, время и тд... Это будет сильно грузить сервер. Для этого создал в базе колонку непрочитанные. Когда поступает сообщение в эту колонку записывается единичка. Когда сообщение просмотрено, меняется на 0. Хочу оптимизировать работу путём запроса только на подсчёт непрочитанных и если они есть обновление всех данных чата.

$sql = "SELECT * FROM users WHERE login='$login'";
if($result = $conn->query($sql)){ foreach($result as $row){ $currentloginid = $row["id"];} $result->free(); } else{ echo "Ошибка: " . $conn->error; }

//получаем непрочитанные
$sql = "SELECT readed FROM chat WHERE idto='$currentloginid' && readed!='0'";
if ($result=mysqli_query($conn,$sql)) {
$updates=mysqli_num_rows($result);
} 

if ($updates==0){
...???
exit;
} else if $updates>=1 { 
require "chatupdate.php";
}

в chatupdate.php запросы на обновление всех данных чата. Как сделать так, чтобы в случае если непрочитанных нет только один раз отправить запрос к файлу chatupdate.php а в следующую секунду на странице всё сохранялось статично?

Сейчас я это почти осуществил путём создания ещё одного файла который единожды инклюдится при переходе в чат и ждёт появления нового сообщения ежесекундным лёгким запросом в базу через аякс. После появления нового сообщения идёт полное обновление чата. Сейчас проблема в том, что на другом конце у собеседника новое сообщение появляется на секундку, а затем исчезает до обновления страницы. Может быть можно что-то в аяксе поправить, чтобы не исчезало?

<script>  
function messageupdatechat()  
{  
    $.ajax({  
        url: "updates/checkupdates.php", 
        cache: false, 
        type: "POST",
        data : {'idtodb':'<?php echo $idtodb ?>', 'pageno':'<?php echo $pageno ?>'}, 
        success: function(html){  
            $("#messagess").html(html);  
        }  
    });  
    
}  

$(document).ready(function(){  
    messageupdatechat();  
    setInterval('messageupdatechat()',1000);  
});  

Ответы (1 шт):

Автор решения: Михаил Горячев

С чатом получилось, как я и говорил, сделал 2х секундный запрос через аякс на отдельный файл php

function messageupdatecheck()  
    {  
        $.ajax({  
            url: "updates/checkupdates.php", 
            cache: false, 
            type: "POST",
            data : {'idtodb':'<?php echo $idtodb ?>', 'pageno':'<?php echo $pageno ?>'},   
            success: function(html){  
                $("#result").html(html);  
            }  
        });   
    }   
    $(document).ready(function(){  
        messageupdatecheck(); 
        setInterval(messageupdatecheck,2000); 
    });

в котором идёт 1-2 лёгких запроса в базу на наличие непрочитанных в текущем чате, где находится пользователь и вообще во всех

//определение переменных
$login = $_SESSION['login'];
$idtodb = $_POST['idtodb'];
$pageno = $_POST['pageno'];

$sql = "SELECT id FROM users WHERE login='$login'";
if($result = $conn->query($sql)){ foreach($result as $row){ $currentloginid = $row["id"];} $result->free(); } else{ echo "Ошибка: " . $conn->error; }

//получаем непрочитанные от остальных
$sql = "SELECT readed FROM chat WHERE idto='$currentloginid' && readed!='0'";
if ($result=mysqli_query($conn,$sql)) {
$updatesall=mysqli_num_rows($result);
} 

if ($updatesall==0) {
  exit;
  mysqli_close($conn);
} else if ($updatesall>=1){
  require_once "success.php";
} 

//получаем непрочитанные от текущего чата
$sql = "SELECT readed FROM chat WHERE idto='$currentloginid' && idfrom ='$idtodb' && readed!='0'";
if ($result=mysqli_query($conn,$sql)) {
$updates=mysqli_num_rows($result);
} 

if ($updates==0) {
  exit;
  mysqli_close($conn);
} else if ($updates>=1){
  require_once "successchat.php";
} 

Если непрочитанные есть в текущем чате, где идёт общение, то идёт запрос на единоразовое обновление чата, где непрочитанное сразу становится прочитанным и обновление больше не происходит, пока не поступит новое сообщение.

    <script>
    function messageupdatechat()  
        {  
            $.ajax({  
                url: "updates/chatupdate.php", 
                cache: false, 
                type: "POST",
                data : {'idtodb':'<?php echo $idtodb ?>', 'pageno':'<?php echo $pageno ?>'}, 
                success: function(html){  
                    $("#messagess").html(html);  
                }  
            });   
        }   
        $(document).ready(function(){  
            messageupdatechat(); 
        });
     </script>

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

Таким образом, получаем вполне себе достойное решение для чата на аякс и PHP которое не терзает сервер лишний раз и не сложно в написании, в отличии от веб сокетов. Ребят, вы поймите, у людей разные запросы, кому-то нужно аналог телеги создать, а кому-то простенький чат, под который просто не рационально писать что-то очень сложное.

→ Ссылка