2011-01-25 3 views
1

Usercase : 사이트의 사용자 기간을 추적해야합니다. 이것은 (end datetime - start datetime)으로 계산됩니다. 사용자가 로그 아웃을 클릭하면 제대로 작동합니다. 시스템은 종료 날짜 시간을 기록 할 수 있습니다. 그러나 가장자리 경우에 문제가 있습니다 : 사용자 세션이 종료 됨 - 사용자의 인터넷 연결이 끊어 졌거나 브라우저가 닫히거나 시스템이 다운 된 경우 등으로 종료됩니다. 이러한 경우 시스템에서 종료 시간을 어떻게 알 수 있습니까? 최종 datetime은 실제 datetime에 최대한 가깝게 계산해야합니다. 이것이 가능하지 않다면 최대 5 분까지는 정확합니다.PHP - 깨진 세션 종료 datetime을 감지하는 방법?

내가 볼 수있는 한 가지 가능한 방법은 클라이언트 시스템을 핑 (ping)하여 활성 상태인지 확인하는 것입니다. 하지만 원하지 않는 대역폭을 추가하기 때문에이 작업을 수행하고 싶지 않습니다. 그렇다면 가장자리 정보를 얻는 다른 방법은 없습니까?

+0

가장 쉬운 방법은 때마다 사용자가 페이지를 요청 데이터베이스에 작업 시간 필드를 증가하는 것입니다. 또는 자체가 엉망인 사용자 지정 세션 처리기. –

+0

페이지 요청은 뉴스 피드와 같은 페이지가 하루 종일 열려 있기 때문에 도움이되지 않지만 활동 시간에 세션 시간 초과를 추가하지 않기를 바랍니다. 따라서 시간의 삭감은 정확하지 않을 것입니다. – SeanD

답변

3

왜 마지막 페이지 뷰의 시간 만 확인하지 않습니까?

브라우저 창을 열어 확인하는 것은 나 같은 사람들이 탭을 열어두고 싶은 사람들에게는별로 도움이되지 않을 것입니다 ... 가장자리의 모든 경우를 다루는 것은 꽤 어려울 것입니다. JS, 프록시 뒤 사람 지원 등). 마지막 페이지 뷰는 수분으로 정확해야하며 정확도를 유지하면서 오버 헤드/복잡성을 최소화해야합니다 ...

+0

문제는 라이브 피드 페이지를 말하는 것과 같습니다. (페이스 북 홈페이지처럼) 사람들은 그 페이지에서 거의 하루 종일 열려 있습니다. 그래서 나의 마지막 견해는 2 시간 전일 수 있습니다. 그것은 정확하지 않습니다. – SeanD

+0

@seanD : Ajax에서 세션을 업데이트해야한다는 요청을했을까요? 그리고 사용자가 탭을 멀리 이동하면, 당신은 그것을 말할 수 없습니다 (글쎄, 당신은 [탭 변경 감지] (http : // stackoverflow.사용자가 자리를 비운 경우 더 정확한 시간을 얻으려고 노력하는 방법에 대한 자세한 내용은 com/questions/2720658/tab-of-a-tab-is-focused-or-not-javascript를 참조하십시오. 그러나 요구 사항에 따라 원시 HTTP 트래픽이 사용자에게 필요한 것을 알려주기에 충분할 정도로 복잡한 작업 일 수 있습니다. – ircmaxell

2

실제로 HTTP는 근본적으로 비 상태 프로토콜. PHP 세션 (및 다른 웹 스크립팅 언어의 비슷한 기능)은 상태가 좋아 보이는 것을 구현하기위한 해킹이지만 이러한 해킹은 HTTP의 상태 비 저장 특성을 완전히 극복 할 수 없습니다. 예를 들어, 사용자가 발견 한 것처럼 서버가 "로그 아웃"프로세스를 거치지 않은 경우 로그 아웃 한 사실을 서버가 알 수있는 방법은 없습니다.

AJAX를 사용하여 사용자에게 ping을 수행 할 수 있지만 앞에서 설명한 것처럼 대역폭을 사용합니다. 또한 사용자가 자바 스크립트 지원을 해제 한 경우에도 작동하지 않습니다.

사용자가 시스템의 페이지를 방문 할 때마다 사용자에 대한 시간 소인을 기록하고 시간 소인이 갱신 된 이후의 시간을 확인하는 것이 유일한 대안입니다. 합리적인 한도 (예 : 20 분)를 초과하면 사용자가 더 이상 귀하의 사이트에 없다고 가정 할 수 있습니다. 다시 말하지만, 사용자가 연기 나 무언가를 방금 나왔을 때 완전히 이상적은 아니지만, HTTP가 무국적이므로 구현할 수있는 솔루션은 전혀 이상적이지 않습니다.

+0

나는 10 분 안에 한 번 사용자에게 핑을 걸 수있다. 나는 적어도 9 분 59 초의 정확도를 제공 할 것이라고 생각한다. 이것은 사람들이 피드 업데이트를 읽는 동일한 페이지에서 하루 종일 앉아있을 수있는 소셜 사이트입니다. Javacript가 사이트에 필요합니다. 그들이 그것을 끄면 그들은 사이트에 들어가는 것이 차단됩니다. – SeanD

0

기본적으로 세션 기록을 요청 시간과 함께 업데이트하는 각 클라이언트 요청시 사용자 세션의 마지막 활동 시간을 추적합니다. 로그인 시간을 저장 한 경우 활성, 비활성 또는 사용자가 로그 아웃했는지 여부와 상관없이 항상 세션 길이를 계산할 수 있습니다. 또한 사용자가 적극적으로 로그 아웃하면 설정된 세션 테이블에 'logged_out'플래그를 넣습니다.

여기 내 세션 테이블의 정의입니다 :

CREATE TABLE IF NOT EXISTS `session` (
    `id` int(11) NOT NULL auto_increment, 
    `php_session_id` varchar(100) NOT NULL default '', 
    `ip_addr` varchar(100) NOT NULL default '', 
    `login_time` datetime NOT NULL , 
    `activity_time` datetime NOT NULL , 
    `user_id` int(11) NOT NULL default '0', 
    `logged_out` tinyint(1) NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `session_id` (`php_session_id`,`ip_addr`), 
    KEY `user` (`user_id`,`logged_out`) 
) ; 
+0

이 키는 FK입니까? – SeanD

+0

아니요, 그들은 단지 색인입니다. 'KEY'와 'INDEX'는 MySQL 테이블 정의에서 서로 바꿔 쓸 수 있습니다. –

관련 문제