2009-11-05 6 views
0

Я пытаюсь использовать периодическое обновление (ajax)/опроса на моем сайте с помощью XMLHttp (XHR), чтобы проверить, есть ли у пользователя новое сообщение в базе данных каждые 10 секунд, а затем, если он сообщает ему/ее путем создания DIV динамически, как это:Периодическое обновление или опрос

function shownotice() { 
    var divnotice = document.createElement("div"); 
    var closelink = document.createElement("a"); 
    closelink.onclick = this.close; 
    closelink.href = "#"; 
    closelink.className = "close"; 
    closelink.appendChild(document.createTextNode("close")); 
    divnotice.appendChild(closelink); 
    divnotice.className = "notifier"; 
    divnotice.setAttribute("align", "center"); 
    document.body.appendChild(divnotice); 
    divnotice.style.top = document.body.scrollTop + "px"; 
    divnotice.style.left = document.body.scrollLeft + "px"; 
    divnotice.style.display = "block"; 
    request(divnotice); 
} 

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

ответ

2

Вы можете проверять новые данные каждые 10 секунд, но вместо проверки db вам необходимо выполнить более эффективную проверку.

Что бы я сделал, это изменить процесс обновления db, чтобы при изменении некоторых данных он также обновлял метку времени в файле, чтобы показать, что произошло недавнее изменение.

Если вы хотите улучшить детализацию, чем «что-то изменилось где-то в db», вы можете разбить его по имени пользователя (или другому идентификатору). Файл (ы), который будет обновляться, будет тогда именем пользователя для каждого пользователя, который может быть заинтересован в обновлении.

Итак, когда скрипт запрашивает сервер, если какая-либо информация для пользователя X более новая, чем время t, вместо того, чтобы делать запрос БД, скрипт на стороне сервера может просто сравнить временную метку файла с параметром времени и посмотреть если в базе данных есть что-то новое.

В процессе, который обновляет базу данных, добавить код (примерно) делает:

foreach username interested in this update 
{ 
    touch the file \updates\username 
} 

Тогда ваша функция, чтобы увидеть, если есть новые данные выглядит примерно так:

function NewDataForUser (string username, time t) 
{ 
    timestamp ts = GetLastUpdateTime("\updates\username"); 
    return (ts > t); 
} 

Once вы обнаружите, что есть новые данные, затем вы можете выполнить полный запрос БД и получить любую необходимую информацию.

0

Это довольно ненадежное и, вероятно, слишком много налогов на сервере в большинстве случаев.

Может быть, вы должны смотреть в нажимной интерфейс: http://en.wikipedia.org/wiki/Push_technology

Я слышал Comet является наиболее масштабируемым решением.

0

Я подозреваю, что Facebook использует Flash-фильм (они всегда загружают один из них под названием SoundPlayerHater.swf), который они используют, чтобы делать некоторые сообщения с их серверами. Это не поймает Firebug (может быть, Fiddler).

3

Я оставил facebook открытым с работающим firebug, и я вижу запросы примерно раз в минуту, что кажется мне изобилием.

Другой подход, используемый Comet, заключается в том, чтобы сделать запрос и оставить его открытым, при этом сервер дриблирует данные клиенту без завершения ответа. Это взломать и нарушает все принципы того, что такое HTTP. :). Но это действительно работает.

0

Это не лучший подход. Потому что вы закончили опрос своего сервера каждые 10 секунд, даже нет реальных обновлений.

Вместо этого подхода к опросу вы можете имитировать нажатие на сервер (reverrse AJAX или COMET). Это позволит значительно снизить нагрузку на сервер, и только клиент будет обновлен, если на сервере будет обновление.

Согласно википедии

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

Для получения дополнительной информации, проверить мой другой ответ на similar question

Смежные вопросы