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