"로그인"및 "로그 아웃"을 허용하는 작은 웹 응용 프로그램을 만들려고합니다. 현재 문제가있는 것은 클라이언트가 서버에 지속적인 "하트 비트"또는 메시지를 보내어 서버가 여전히 활성 상태임을 알리는 것입니다.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;
}
}
}
확실하지 않습니다. 예, 나는 사용자의 브라우저가 충돌 한 경우 (예 : window.onbeforeunload 이벤트가 발생하지 않고 Ajax 요청을하는 데 하트 비트가 아닌 것)와 같은 문제를 잡을 수 있기를 원합니다. – funseiki
나는 당신이 이것을 위해 무엇을해야하는지 아직도 혼란 스럽다. 사용자가 아직 로그인하고 있는지 확인하는 것이 목표입니까? 요청을 할 때마다 확인하고 마지막 요청 시간을 작업 단위로 기록하지 않는 이유는 무엇입니까? –
혼란에 빠져서 죄송합니다. 네, 여전히 사용자가 로그인하고 있는지 확인하고 싶습니다. 클라이언트 측의 하트 비트 (예 : 자바 스크립트 코드의 아약스 요청)를 통해 사용자는 여전히 온라인 상태인지 확인할 수 있지만 실제로 "확인"을 수행 할 위치는 어디입니까? 오프라인 상태가 아닌지 확인하십시오. 지금 당장은 window.unload 이벤트가 발생하면 클라이언트가 창을 닫았다는 Ajax 메시지를 보냅니다. onload 이벤트가 발생하면 클라이언트는 서버에 창이 열려 있음을 알립니다. 이제 클라이언트의 인터넷 연결이 실패하면 어떻게됩니까? 서버는 어떻게 알 수 있습니까? – funseiki