2012-02-12 3 views
1

"로그인"및 "로그 아웃"을 허용하는 작은 웹 응용 프로그램을 만들려고합니다. 현재 문제가있는 것은 클라이언트가 서버에 지속적인 "하트 비트"또는 메시지를 보내어 서버가 여전히 활성 상태임을 알리는 것입니다.PHP/JS의 클라이언트에서 서버로 "하트 비트"

이것은 논리적 인 질문입니다. 내가 원하는 것은 n 개의 하트 비트가 건너 뛰었는지 확인하는 PHP의 while (1) 루프를 사용하는 것입니다. 나는 여전히 클라이언트와 서버가이 루프가 진행되는 동안 상호 작용할 수 있기를 원한다. (본질적으로 서버가 별도의 "check_for_heartbeats"스레드를 가지고있는 것처럼 동작해야한다.)

PHP를 사용하여 어떻게 수행하나요? 현재 XAMPP를 실행 중입니다. 어떤 도움을 많이 주시면 감사하겠습니다.

편집 : 분명히하기 위해 window.unload 이벤트가 실행되지 않는 경우에도 브라우저 닫기 이벤트를 catch 할 수 있습니다. (예 : 클라이언트가 인터넷에서 연결이 끊어집니다.)이 경우, 하트 비트를 모니터하는 스레드를 갖는 것이 가장 직관적 인 솔루션 인 것 같습니다. PHP로 만드는 방법을 모르겠습니다.

편집 2 : 나는 sLoggedIn()은 세션 부울 변수 ($ _SESSION [ 'is_logged_in')]가 설정되어 있는지 확인하는 헬퍼 함수입니다.

최종 편집 : 좋아요, 이제 나는 코멘트와 응답이 무엇을 말하고 있었는지 정확하게 이해합니다. 따라서 의역을 말하자면 다음과 같습니다. 서버에 "하트 비트"를 전송하는 자바 스크립트 코드가 있어야합니다. 서버는 이러한 박자와 관련된 타임 스탬프를 추가합니다. 데이터베이스가이 시간 소인을 보유하도록 수정하십시오. 전체 "시간 소인"테이블 ('timestamp'속성이있는 '사용자'테이블)을 쿼리하고 NOW와 마지막 시간 소인의 차이가 특정 임계 값보다 큰지 확인하십시오. 이 임계 값을 통과 한 사용자는 "로그 오프"하십시오.

유일한 문제는 로그인 한 사용자가 있거나 모든 사용자가 동시에 연결을 끊을 경우입니다.하지만이 경우 아무도 사용자가 연결이 끊어 졌음을 알 수 없습니다.

이것은 여러 응답의 조합이지만 chris의 응답이 문제의 대부분을 담당한다고 생각합니다. 유용한 도움을 주신 Chris와 Alex Lunix에게 감사드립니다. : D 여기

더 나은 설명하기위한 코드입니다

서버 측 :

function checkBeats() 
{ 
    while(isLoggedIn()) 
    { 
     // it's been > 30 secs since last heartbeat 
     if((time() - $_SESSION['heartbeat']) > 30) 
     { 
      logout(); 
      break; 
     } 
    } 
} 
+0

확실하지 않습니다. 예, 나는 사용자의 브라우저가 충돌 한 경우 (예 : window.onbeforeunload 이벤트가 발생하지 않고 Ajax 요청을하는 데 하트 비트가 아닌 것)와 같은 문제를 잡을 수 있기를 원합니다. – funseiki

+1

나는 당신이 이것을 위해 무엇을해야하는지 아직도 혼란 스럽다. 사용자가 아직 로그인하고 있는지 확인하는 것이 목표입니까? 요청을 할 때마다 확인하고 마지막 요청 시간을 작업 단위로 기록하지 않는 이유는 무엇입니까? –

+0

혼란에 빠져서 죄송합니다. 네, 여전히 사용자가 로그인하고 있는지 확인하고 싶습니다. 클라이언트 측의 하트 비트 (예 : 자바 스크립트 코드의 아약스 요청)를 통해 사용자는 여전히 온라인 상태인지 확인할 수 있지만 실제로 "확인"을 수행 할 위치는 어디입니까? 오프라인 상태가 아닌지 확인하십시오. 지금 당장은 window.unload 이벤트가 발생하면 클라이언트가 창을 닫았다는 Ajax 메시지를 보냅니다. onload 이벤트가 발생하면 클라이언트는 서버에 창이 열려 있음을 알립니다. 이제 클라이언트의 인터넷 연결이 실패하면 어떻게됩니까? 서버는 어떻게 알 수 있습니까? – funseiki

답변

2

무엇 내가 일반적으로 할 것은 당신이 자바 스크립트 (jQuery를) 사용하여 PHP 파일을 호출하고 데이터베이스를 업데이트하거나 whatevery입니다 처럼. 이 질문은 당신에게 대답 할 수 있습니다 : Whats the easiest way to determine if a user is online? (PHP/MYSQL)

+0

응답을 주셔서 감사합니다,하지만 내가 뭘하려고 오전 제안 된 답변의 반대입니다 생각합니다. 내가 바라는 것은 사용자가 연결이 끊어 지거나 브라우저가 다운되는 경우 또는 window.unload 이벤트가 실행되지 않아서 사용자가 다른 사람과 연결되지 않는 경우를 처리하기 위해 사용자의 박동이 중단되지 않았는지 확인하는 방법이었습니다. 데이터베이스에 "로그온 한"것으로 간주됩니다. – funseiki

+0

그래서이 권리를 얻는다면 사용자가 브라우저를 닫거나 인터넷 케이블을 뽑을 때 직접 통보하지 않을 것입니까? – chris

+0

어떻게 사용 하시겠습니까? 어떤 사람이 로그인했는지 어떻게 확인합니까? (귀하의 "isLoggedIn"기능). 나는 페이스 북이 두 페이스 북 계정을 가지고 있고 내가 2 대의 다른 컴퓨터에 로그인 한 것처럼 링크에서 (내가 살고있는 채팅을 위해) 제안했다는 것을 추측하고있다. 나는 여전히 약 30 초 동안 온라인으로 보여줄 것이다. 두 번째 컴퓨터를 종료 한 후. 보다 "라이브"상태로 만들기 위해서는 온라인 상태를보다 자주 업데이트해야합니다. – chris

1

하트 비트 세션 변수를 변경하는 스크립트에 하트 비트를 사용하고 모든 스크립트의 맨 위에서이 체크를합니다 (함수에 넣고 당연히 호출하십시오) :

// it's been > 30 secs since last heartbeat 
if((time() - $_SESSION['heartbeat']) > 30) 
{ 
    logout(); 
} 

편집 : 데이터베이스 대신 그들은 다음 페이지를 방문 할 때의 바로 그 상태를 반영하려는 경우, 당신은 MySQL을 사용해야합니다 .

mysql_query("UPDATE `users` SET `loggedin`=0 WHERE heartbeat<".time()-30); 

: 데이터베이스를 확인 (예 : 자바 프로그램과 같은) 다른 프로그램을 사용하지 않고 내가 생각할 수있는 유일한 것은 (물론 호출되는 함수에) 모든 페이지의 상단에이를 추가하는 것입니다 어느 것이 모든 사용자를 업데이트 할 것인데, 이는 기록 된 값의 정확성이 페이지 뷰의 빈도로 설정된다는 것을 의미합니다.

+0

로그 아웃 할 필요가 없습니다.사용자가 오프라인이되면 스크립트는 호출되지 않습니다. – Umbrella

+0

요점은 그들이 다음에 방문 할 때 심장 박동을 얻지 못하면 다시 로그인해야하지만 시스템이 다음 방문 때까지 오프라인 상태임을 인식하지 못한다는 것입니다. –

+0

이해가 부족하여 죄송합니다. 귀하가 언급 한 편집 내용을 게시했습니다. 통찰력에 감사드립니다! – funseiki

관련 문제