2010-07-29 3 views
1

세션이 삭제 될 때마다 함수를 실행하고 싶습니다. session_set_save_handler를 사용하여 조사했지만 세션 저장 영역을 수동으로 처리하고 싶지는 않습니다. 단지 파괴되었을 때 약간의 처리 만하고 싶습니다. session_set_save_handler를 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까?세션이 파괴 될 때 PHP에서 실행할 함수를 등록하십시오.

답변

1

처리기는 내가 생각하는 유일한 방법입니다. 또한 세션은 가비지 수집의 일부로 파괴 될 수 있으며 두 세션 모두 내가 아는 session_set_save_handler를 사용하여 차단할 수 있습니다.

0

register_shutdown_function()으로 할 수 있습니다. 이 함수는 스크립트가 종료 될 때 실행됩니다.

편집 : 위의 대답이 잘못되었으므로 더 나은 답변을 제공하기 위해 편집 중입니다. session_destroy()에 전화하기 전이나 후에 원하는 기능을 호출 할 수 있습니다. session_destroy()을 명시 적으로 호출 할 때만 세션이 지워집니다. PHP는 또한 시스템 관리자가 설정 한 경우 cron 작업의 만료 된 세션을 정리하지만 PHP 스크립트에서 해당 정리에 영향을 줄 수는 없습니다.

+0

그리고 스크립트가 끝날 때 정리되면 세션을 사용하는 것이 무엇이겠습니까? :) – Blizz

+0

처음 읽는 데 실수가있었습니다. 세션이 파괴되거나 세션이 닫히는 것은 실제로는 다른 일입니다. – Wrikken

+0

우리가 실수 한 것처럼 보입니다. 나는 내 대답을 개정했다. 희망이 도움이됩니다. – jmz

0

내가보기에 유일한 방법은 쓰레기 처리를 돌리는 것입니다. memcached 기반 세션에서는 작동하지 않지만 파일 세션은 쉽게 추적 가능 /로드 가능/제거 가능합니다 (세션 디렉토리에서 최근에 액세스하지 않은 파일을 찾습니다).

0

세션을 수동으로 관리하지 않는다면 대부분 파일로 저장되므로 Wrikken이 말한 것처럼 cron 작업으로 이전 세션 파일을 직접 삭제할 수 있습니다.

하지만 실제로 가비지 수집기의 역할입니다. 그리고 전체 session_set_save_handler는 사용하기가 어렵지 않습니다. 기성품을 설치하고 가비지 수집기가 호출 될 때 함수를 트리거 할 수 있습니다.

0

이것은 Java, .NET 등의 전체 응용 프로그램 플랫폼을 사용하는 다른 언어에서도 쉽게 수행 할 수 있습니다. 예를 들어 시작, 응용 프로그램 시작, 세션 종료 등에서 서버에 의해 시작되는 이벤트가 있습니다. PHP에는 다른 언어와 같은 의미로 "애플리케이션"이라는 개념이 없으므로 앱 서버에 의해 해고되는 이벤트가 없습니다. 그러나 수동으로 할 수있는 일이 있습니다.

아마도 가장 쉬운 방법은 모든 페이지로드시 로그인 한 각 사용자에 대해 DB 레코드를 타임 스탬프하는 것입니다. 그런 다음 cron 작업을 실행하여 만료 된 타임 스탬프 (사용자가 20 분 이내에 다른 페이지를로드하지 않았거나 시간 제한이 무엇이든간에)을 찾습니다. 그런 다음 필요한 모든 조치를 취할 수 있습니다. 이것에 대한 좋은 보너스는 주어진 순간에 어떤 사용자가 시스템에 로그인했는지 모니터링하기 위해 무언가를 쓸 수 있다는 것입니다.

또 다른 아이디어는 서버에 실제로 세션 파일이 들어있는 PHP 폴더를 살펴볼 수있는 무언가를 쓸 수 있다는 것입니다. 그러나 이들을 사용자와 일치시키는 것은 아마도 어려울 것입니다.

관련 문제