2009-11-05 2 views
0

XMLHttp (XHR)에 의한 주기적 새로 고침 (ajax)/폴링을 사용하여 사용자가 매 10 초마다 데이터베이스에 새 메시지를 가지고 있는지 확인한 다음 알려주는 경우/다음과 같이 동적으로 사업부를 만들어 그녀의 :주기적 새로 고침 또는 폴링

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에 로그인하고 방화 광 아래서 점검 할 때 아무런 요청이 일어나지 않거나 계속되고 있기 때문에 이것을하는 또 다른 방법이 있습니까? 그렇지만주기적인 새로 고침도 사용하고 있다는 것을 알고 있습니다. 어떻게해야합니까?

답변

2

10 초마다 새 데이터를 확인할 수 있지만 db를 확인하는 대신 영향을 적게 검사해야합니다.

DB 업데이트 프로세스를 수정하여 일부 데이터를 변경할 때 파일의 타임 스탬프를 업데이트하여 최근 변경 사항이 있음을 보여줍니다.

"db 어딘가에서 변경된 것"보다 세분화가 필요한 경우 사용자 이름 (또는 다른 식별자)으로 구분할 수 있습니다. 업데이트 할 파일은 업데이트에 관심이있는 각 사용자의 사용자 이름입니다.

그래서 DB 쿼리를 작성하는 대신 사용자 X가 시간 t보다 새로운 정보를 서버에 요청하면 서버 측 스크립트는 파일의 시간 소인과 시간 매개 변수를 비교하여 데이터베이스에 새로운 것이 있으면. 일단

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

: 새로운 데이터가있는 경우

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

그런 다음 함수가 볼 수

이 같은 : DB를를 업데이트하는 과정에서

는 (대략) 수행하는 코드를 추가 새로운 데이터가 있다는 것을 알게되면, 완전한 DB 쿼리를 수행하고 필요한 정보를 얻을 수 있습니다.

0

이것은 매우 신뢰할 수 없으며 대부분의 경우 서버에 너무 부담이됩니다. 내가 혜성이 가장 확장 가능한 솔루션입니다 들었습니다 http://en.wikipedia.org/wiki/Push_technology

:

아마 당신은 푸시 인터페이스에보고해야한다.

0

나는 페이스 북이 서버와 통신 할 때 사용하는 Flash 무비 (그들은 항상 SoundPlayerHater.swf라는 하나의 파일을 다운로드 함)를 사용하고 있다고 생각합니다. 이것은 Firebug에 의해 잡히지 않습니다 (Fiddler가있을 수도 있음).

3

나는 방화범이 튀는 동작으로 페이스북을 열어두고 1 분에 한 번씩 요청을 보게된다.

Comet에서 사용하는 다른 방법은 서버가 응답을 완료하지 않고 클라이언트에 데이터를 빼내어 요청을 작성하고 열어 두는 것입니다. 이것은 해킹이며, HTTP가 무엇인지에 대한 모든 원칙을 위반합니다. :) 그러나 그것은 효과가있다.

0

이것은 더 나은 방법은 아닙니다. 실제 업데이트가 없어도 매 10 초마다 서버를 쿼리하게 되었기 때문입니다.

이 폴링 방식 대신 서버 푸시 (reverrse AJAX 또는 COMET) 접근 방식을 시뮬레이션 할 수 있습니다. 이렇게하면 서버 작업 부하가 줄어들고 서버 측에 업데이트가있는 경우 클라이언트 만 업데이트됩니다. 위키 피 디아 당으로

역 아약스는 웹 서버와 브라우저 사이의 낮은 대기 시간 통신을 가능하게 수명이 긴 HTTP를 연결을 사용하여 Ajax 디자인 패턴을 의미

. 기본적으로 클라이언트에서 서버로 데이터를 전송하는 방법은 이며 서버 데이터 을 브라우저로 푸시하기위한 메커니즘은 입니다.

는 더 많은 정보를 들어, similar question

내 다른 반응을 체크 아웃
관련 문제