Ajax-чат - обновляется только при наличии изменений - PullRequest
8 голосов
/ 11 июня 2010

В настоящее время у меня есть чат на основе Ajax, который я пытаюсь упростить, загружая скрипт чата только при обновлении.Таким образом, ничего не нужно продолжать загружать, если ничего не изменилось в базе данных.

Моя текущая логика гласит:

  • Функция JavaScript запускается каждые полсекунды для получения журналов чата (setInterval())

Если ничего не изменилось, кажется, неэффективно продолжать его называть.Вместо этого я хотел бы сделать следующее:

  1. Функция JavaScript проверяет, есть ли в базе данных новые журналы
  2. Если ДА - загрузить новыйлоги, если НЕТ - оставьте текущие отображаемые логи в покое.

Как бы я поступил об этом, хотя?В настоящее время я использую функцию:

function updateShouts() {
    $('#chatArea').load('chat.php'); // load chat logs
}
setInterval("updateShouts()", 500);  // call function every half a second

Ответы [ 5 ]

3 голосов
/ 11 июня 2010

Я бы передавал timestamp с (или message_id с) вместе с любыми сообщениями чата, которые серверный скрипт отправляет клиенту.Затем клиент просто запрашивает новые сообщения, а сервер отправляет только то, что ново.

Итак, представьте, что каждое сообщение чата имеет идентификатор.Я бы спроектировал chat.php так, чтобы он принимал такой параметр:

chat.php?since=12345

12345 будет id из последнего сообщения, которое видел клиент.chat.php по сути делает что-то вроде:

SELECT * FROM chatmessages WHERE id > $since

... и передает обратно небольшую небольшую структуру данных (скажем, массив объектов, закодированных в JSON).

Итак,если нет новых сообщений чата, сервер просто передает обратно пустой массив.

Я не думаю, что вы можете быть более эффективным, чем это.

РЕДАКТИРОВАТЬ:

Я понимаю, что для этого нужно немного больше кодирования на стороне клиента.Вы больше не просто обновляете некоторый div со всей историей чата.Вам также понадобится обработчик для вашего вызова ajax, который перебирает результаты, и для каждого сообщения программно создайте div для этой строки, а затем добавляете его в свой чат div.

1 голос
/ 11 июня 2010

Один из относительно простых способов сделать это - использовать AJAX для извлечения страницы, которая просто сообщает вам, было ли какое-либо обновление. Например, вы можете получить страницу типа checkForUpdate.php с 1 или 0, чтобы указать, есть ли что-то новое в чате. Если вы вернули 1, вы можете продолжить и загрузить полную страницу chat.php.

(Если вы раньше не использовали AJAX, это довольно хороший учебник: http://www.tizag.com/ajaxTutorial/)

Другое решение (и я думаю, что оно, вероятно, лучше) - это загрузить страницу, на которой есть только самые последние строки чата. Например, предположим, что в данный момент отображаются строки 1–14 чата. Затем вы можете использовать AJAX для получения содержимого, например, getLines.php?s=14. На этой странице будут отображаться только строки чата после 14-й строки. Затем вы просто добавите эти строки в конец текущего окна чата.

0 голосов
/ 11 июня 2010

Я бы сначала создал файл с именем например messages.php, который выглядел примерно так:

<?php header('Content-Type: application/json');

$messages_since = !empty($_POST['since']) 
    ? mysql_real_escape($_POST['since']) 
    : '0000-00-00 00:00:00');

// Get all messages from database since the $messages_since date_time

echo json_encode($array_with_messages);

Затем на стороне клиента, используя jQuery или что-то подобное, я бы сделал что-то вроде этого:

  1. Получать сообщения, используя что-то вроде $.post('messages.php', new_messages_handler)
  2. В обработчике я бы создавал html для каждого полученного нами нового сообщения и добавлял / добавлял его в контейнер чата, а также сохранял время.последнее сообщение было создано.
  3. Подождите некоторое время
  4. Получите новые сообщения, используя что-то вроде $.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler)
  5. Перейдите к 2

Как минимуму меня в голове все работает: p

0 голосов
/ 11 июня 2010

В любом случае вам нужно запросить базу данных на стороне сервера, поэтому практически не имеет значения, возвращает ли она данные журнала или одно значение.Вы можете принять решение не обновлять #chatArea, основываясь на возвращаемом значении, но в противном случае вы должны сделать еще один вызов для получения журналов.

0 голосов
/ 11 июня 2010

Как вы знаете, функция .load заполняет элемент выводом, возвращаемым вашим файлом chat.php.Эта функция .load выполняет два шага: отправляет ajax-запрос к chat.php, а затем устанавливает значение элемента в выходной файл chat.php.То, что вы хотите сделать, это только первый шаг.Для этого используйте функцию .ajax

http://api.jquery.com/jQuery.ajax/

Вместо использования файла chat.php, я бы предложил вызвать другой скрипт, например isChatUpdated.phpЭтот скрипт будет работать так же, как подсказывает название, и проверяет, не было ли каких-либо изменений в чате.Затем вы можете использовать этот результат, чтобы выяснить, нужно ли вам вызывать функцию .load.

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