Страница чата с использованием $ .ajax и PHP jQuery не обновляется своевременно

Я создаю страницу чата для участников одного из моих сайтов. У меня все работает нормально, кроме автоматического обновления чата. Страница чата должна проверять наличие новых сообщений каждые 5 секунд, а манипулирование с обратными вызовами показывает, что эта часть работает правильно; однако файл PHP, на который ссылается $ .ajax, дает мне два совершенно разных поведения. Поскольку ajax работает правильно в каждом тесте, который я выполнил, я исключу его здесь, но я могу добавить его, если кто-то сочтет это необходимым. Это мой аннотированный PHP:

$new_chat = //new chat message, collected from $.ajax and sanitized
$new_sender = //username of sender, collected from $.ajax and sanitized
$new_time = date('m-d-y');
$most_recent_chat = //unique id# of most recent chat message, collected from $.ajax and sanitized

//This block makes sure that there is a most recent chat; if not, (i.e., the
//page was just loaded so there are no chats on the page) it manually sets one.
//I'm not having any problems with this block.

if (!isset($most_recent_chat)) {
$query = "SELECT MAX(id) AS 'Most Recent' FROM `chat_global`";
$check_last_chat = new mysqli($host,$user,$pass,$game_db);

$check_last_chat->query($query);

if(!$result = $check_last_chat->query($query)) {
die();
}

while ($row=$result->fetch_assoc()) {
$most_recent = $row['Most Recent'];
}
$most_recent_chat = $most_recent-100;
$result->free();
$check_last_chat->close();
}

//Send any new chats to DB

if(isset($new_chat)) {
//First query inserts new chats into the chat table
$query = "INSERT INTO `chat_global` (message,sender,time) VALUES ('".$new_chat."','".$new_sender."','".$new_time."');";

$add_new_chat = new mysqli($host,$user,$pass,$game_db);

$add_new_chat->query($query);
$add_new_chat->close();

//Second query returns all new chats in reference
//to the most recent chat on the user's browser page

$query2 = "SELECT * FROM `chat_global` WHERE id>'$most_recent_chat';";

$most_recent_chats = new mysqli($host,$user,$pass,$game_db);

if(!$result = $most_recent_chats->query($query2)) {
die();
}

while($row = $result->fetch_assoc()) {
echo '<div class="chat-item" data-chat-id="' . $row['id'] . '">';
echo '<p class="chat-message"><strong>' . $row['sender'] . ': </strong>' . $row['message'] . '</p>';
echo '<p class="chat-time">' . $row['time'] . '</p></div>';
}

$result->free();
$most_recent_chats->close();
} else {
//Query 2 from above is repeated; basically, skips adding new message
//and simply retrieves any other new messages
$query2 = "SELECT * FROM `chat_global` WHERE id>'$most_recent_chat';";

$most_recent_chats = new mysqli($host,$user,$pass,$game_db);

if(!$result = $most_recent_chats->query($query2)) {
die();
}

while($row = $result->fetch_assoc()) {
echo '<div class="chat-item" data-chat-id="' . $row['id'] . '">';
echo '<p class="chat-message"><strong>' . $row['sender'] . ': </strong>' . $row['message'] . '</p>';
echo '<p class="chat-time">' . $row['time'] . '</p></div>';
}

$result->free();
$most_recent_chats->close();
}

Блок if (isset ($ new_chat)) прост и не доставляет мне проблем. По сути, если появляется новое сообщение, оно добавляет новое сообщение в базу данных чата, а затем возвращает все сообщения с идентификационными номерами, превышающими самые последние с точки зрения браузера. Эта часть работает и возвращает информацию в браузер в течение 1/4 секунды.

Блок else в этом коде — это то, где у меня возникают некоторые проблемы. Блок else — это та же строка строка за строкой, что и вторая половина блока if (от $ query2 вниз). Это работает, но очень медленно; тогда как блок if загружается с сервера в среднем за 1/4 секунды, а блок else (который меньше кода) возвращает данные в среднем за 90 секунд. Вызов $ .ajax — это одна и та же функция независимо от того, отправил пользователь сообщение или нет; единственное отличие состоит в том, что на блок if ссылаются, если пользователь отправил сообщение (и поэтому вызов $ .ajax является ручным), но на блок else автоматически ссылается повторяющаяся строка setTimeout (function, 5000) в браузере.

Я на 99,9% уверен, что setTimeout () работает правильно, потому что, если я вручную установлю свой вызов $ .ajax для отправки универсального $ new_chat (то есть «Это сообщение»), функция будет работать каждый раз; каждые 5 секунд он отправляет чат, а спустя 1/4 секунды я вижу, что он появляется на моей странице чата, как и ожидалось. (Моя страница чата полностью заполнена вышеуказанным PHP; даже сообщения, отправленные пользователем A, должны быть отправлены в указанный файл, обработаны и отправлены обратно пользователю A, чтобы пользователи могли знать, что их сообщение было отправлено.)

Суть в том, что я в полной растерянности относительно того, почему происходит такое поведение. $ .Ajax находится в той же функции, будь то автоматический или ручной; PHP — тот же самый код, и более медленный блок также короче загружается! Вызов $ .ajax выполняется очень быстро, когда он выполняется вручную, и если сообщение отправляется вместе с автоматическим $ .ajax, оно также выполняется очень быстро. Я новичок в AJAX и jQuery, поэтому я хотел бы думать, что проблема заключается в одной из этих технологий, но с того места, где я сижу, нет никакого смысла.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]