2012-06-11 3 views
-1

내 웹 사이트에 대한 채팅을하고 있습니다. 이를 위해 온라인에 등록 된 사용자의 수를 찾아야합니다. 세션 수를 세어 테이블에 저장합니다. 로그 아웃하면 이름이 해당 테이블에서 제거됩니다. 이제 로그 아웃을 클릭하지 않고 탭을 직접 닫으면 오프라인이되지 않습니다. 그들의 이름은 여전히 ​​테이블에 있습니다. 그래서 그들을 제거하기 위해, 나는 매우 복잡한 알고리즘을 온라인에서 발견했습니다. 그것은 5 분마다 그 테이블을 비우고 다시 온라인 인 사람들의 이름을 덧붙입니다. 그러나 문제는 이것이 발생하는 동안 채팅이 중단된다는 것입니다. 그래서이 문제를 해결할 방법이 필요합니다.온라인 사용자를 찾는 방법

+0

사용 http://xmpp.org/ – Katti

+1

을 확인하시기 바랍니다 데이터베이스 테이블 구조와이 테이블 구조가 서로 관련되는 f}을 설명해야합니다. 이상적으로 3 개의 테이블이 있어야합니다. 하나는 사용자 정보 용, 다른 하나는 채팅 텍스트 저장 용, 다른 하나는 활성 사용자 목록 저장 용입니다. '채팅이 중단되었습니다'라는 의미를 설명해야합니다. 사용자가 채팅 기록을 잃어 버렸거나 시스템이 테이블을 비운 동안 채팅을 할 수 없다는 것을 의미합니까 (이는 일종의 잠금을 의미 함). –

답변

4

"마지막 활성"열을 추가하십시오. 사용자가 브라우저 (예 : AJAX를 통해 더 많은 메시지를 폴링하는 것을 포함 할 수 있음)를 수행 할 때마다 해당 열을 NOW()으로 업데이트합니다. 테이블은 괜찮지 만, 아마도 옵션 개선 사항 (사이트의 부하에 따라)에서 이전 기록을 삭제

SELECT user.name FROM user 
    WHERE DATE_ADD(user.last_active, INTERVAL 5 MINUTE) >= NOW(); 

: 그런 다음 활성 사용자를 찾는 쿼리는 식으로 뭔가를 할 수 있습니다.

0

두 가지 해결책이 있다고 생각합니다.

1) 1. 타임 스탬프를 저장하고 cronjob을 만드십시오. cron check는 1 분마다 또는 2 분 정도의 항목이 얼마나 오래된지를 확인하고 예를 들어 5 분보다 오래된 항목을 삭제합니다.

2.) 두 번째 방법은 포인트 1과 동일한 기능을하는 funktion을 만들지 만 모든 페이지 호출마다 함수를 실행합니다. 그러나 이것은 실제로 효과가 없으며 많은 부담을줍니다.

1

아마이 조사 : destroy session on window close?

대신 세션을 파괴하는 당신은 행을 삭제하는 쿼리를 실행할 수 있습니다. 당신은 DB 테이블에 세션을 저장하는 경우

+0

[onunload] (http://www.w3schools.com/jsref/event_onunload.asp) 이벤트를 사용할 수도 있습니다. – ceving

관련 문제