2010-02-13 6 views
3

오픈 소스 프로젝트를 일부 변경하려고합니다. 사용자가 언제 로그인하여 로그 아웃했는지 추적하고 싶습니다. 지금은 로그인하거나 수동으로 로그 아웃 할 때 db로 로그인 상태를 변경합니다. 현재 문제는 사용자가 로그 아웃 버튼을 누르지 않고 브라우저를 닫은 지 확인할 수 없다는 것입니다. 이런 이유로 사용자 세션이 만료 될 때마다 데이터베이스를 변경하는 함수를 트리거해야합니다. PHP에서 session_set_save_handler을 시도했지만 전체 세션 비헤이비어를 무시해야합니다. 내가 원하는 것은 기본 세션 동작을 유지하고 사용자의 세션이 만료 될 때 기능을 추가하는 것입니다. 그렇게 할 수있는 방법이 있습니까?PHP 세션 만료 이벤트

답변

4

나는 뭔가를 정말로 한 번 괴롭 혔습니다. 세션이 페이지 새로 고침/가져 오기/등으로 "업데이트"될 때마다 DB 행의 타임 스탬프를 업데이트했습니다. 두 번째 데몬은 10 분마다 DB를 폴링하고 "정리"작업을 수행했습니다.

목표를 달성하기위한 기본 PHP 기능을 찾을 수 없습니다. 세션 시간 초과가 백그라운드에서 실행되지 않습니다. 시간이 초과 된 세션이 다른 액세스를 시도하지 않는 한 세션이 시간 초과되었는지 알지 못합니다. 이 시점에서 함정에 빠지기가 거의 불가능합니다. 당신은 당신의 결정을 내리고 그것을 적절하게 다룰 수 있습니다.

이 문제에 대한 대기열 & 폴링 아키텍처를 권장합니다. 쉽고 확실히 작동 할 것입니다. 트랜잭션 성능에 대한 우려가 있으시면 memcached를 추가하십시오.

+0

나는 비슷한 것을했습니다. 사용자의 최근 페이지/활동을 업데이트하고 데이터베이스를 폴링하여 2 분보다 큰 비활성 세션을 찾고 둘 다 삭제하는 기능을 만들었습니다. 한 돌로 2 마리의 새를 죽일 수 있다고 생각했습니다. 지저분하지만 크론 작업을 만들지 않고 일을 끝냈습니다. –

0

표준 PHP 파일 기반 세션을 사용하고 있다고 가정합니다. 그렇다면 PHP는 php.ini의 session.gc_ * 설정 매개 변수를 기반으로 부실 세션의 자체 가비지 콜렉션을 수행합니다. 가비지 컬렉터를 완전히 비활성화 한 다음 GC 스크립트를 롤백 할 수 있습니다.

'오래된 세션'을 찾으려면 stat() 루프를 사용하여 빠르고 쉽게 파일의 타임 스탬프를 확인하거나 각 파일의 데이터를 구문 분석하여 마지막 파일을 나열하는 변수를 확인하십시오 - 접근 시간. 어느 쪽이든, 세션 파일은 단지 serialize($_SESSION)의 출력이며 다른 PHP 인스턴스로 간단히 다시로드 할 수 있습니다.

-1

자바 스크립트에서 창 닫기 이벤트는 어떻게됩니까? 그래서 기본적으로 세션은 세션 사이트의 모든 창을 닫을 때 파괴됩니다. 따라서 마지막 창을 닫을 때 (이것은 추가 js 점검을 통해 확인됩니다) 서버에 ajax 요청을 보냅니다.

+0

좋은 생각이지만, 창을 닫았다고해서 세션이 끝났다는 것을 의미하지는 않는다. 브라우저를 열어 두었다가 웹 페이지를 다시로드해도 원래의 세션을 계속 사용할 수 있습니다. 뿐만 아니라 동일한 도메인에 다른 웹 페이지를 하나의 웹 페이지로 남겨두면 여전히 사이트를 방문하는 동안 세션 정보를 데이터베이스에서 제거하는 ajax 이벤트가 발생합니다. 브라우저 종료를 확인하는 자바 스크립트 이벤트가 있다면 더 좋을 것입니다. –