2011-01-20 2 views
0

사용자의 세션 ID를 이름으로 사용하여 서버에 사용자 업로드 파일을 저장하는 업로드 기능을 만듭니다. 이제,이 파일이 해당 세션이 활성화 될 때까지 서버에 보관하려고합니다.특정 ID가있는 세션이 만료되었는지 확인하십시오.

내 질문은 세션 ID가 세션이 활성 또는 만료되었는지 여부를 어떻게 확인할 수 있는지에 따라 나중에 사용자가 업로드 한 파일을 안전하게 삭제할 수 있도록하는 것입니다.

이 작업은 이전에 사용 해본 적이 없지만 특정 간격으로 정리 작업을하고 싶습니다.

+0

나는 마침내 만료 된 세션을 제거하는 것이 웹 서버의 일임을 기억하므로이 메커니즘에 연결할 수 있을까요? – Mchl

+0

@Mchl 예, 그렇습니다. 만료 된 세션을 제거하는 것은 서버의 작업이지만 원하는 작업은 아닙니다. 나는 그의 세션이 만료되었거나 내 서버의 공간을 차지하는 많은 원치 않는 파일이있을 경우 사용자가 업로드 한 파일을 제거하려고합니다. –

답변

2

이 시간 이후에는 세션이 가비지로 표시되고 가비지 수집기는 기본적으로 1 %의 확률 (session.gc_probability)로 시작하기 때문에 session.gc_maxlifetime에만 의존 할 수 없습니다.

더 나은 방법은 IMHO가 만료 된 데이터를 처리하는 것입니다.

당신은 예를 들어 시간을 시작하고 세션 변수에 저장할 수 있습니다 :

<?php $_SESSION['last_seen'] = time();//Update this value on each user interaction. ?> 

Later..via 크론은이 같은 일을 할 수 있습니다

<?php 
//Get the session id from file name and store it into the $sid variable; 
session_id($sid);//try to resume the old session 
session_start(); 
if (isset($_SESSION['last_seen']) && $_SESSION['last_seen'] > $timeout){//Session is expired 
    //delete file 
    session_destroy(); 
}else if (!isset($_SESSION['last_seen')){ //already garbaged 
    //delete file 
    session_destroy(); 
} 
?> 

테스트하지 ... 그냥 아이디어

+0

감사합니다. 시도하고 알려 드리겠습니다. –

0

간격은 다음과 같이 만들 수 있습니다 -> PHP 스크립트 실행 - - 누군가가 당신의 웹 열립니다 파일 시간 outed 경우>는 검사 -> 시간 oted 파일

그리고

:-) 필요하지 CRON 삭제

사용자가 브라우저 창을 닫았거나 닫지 않은 경우 정보가 부족하여 닫히지 않음 (세션을 닫지는 않았지만 절전 모드를 켜고 2 일 후에 돌아 오는 경우 - AFAIK 세션이 여전히 활성 상태 임) - 최선의 방법으로이 문제를 슬 루잉 (slove)하는 유일한 아이디어는 AJAX 검사와 함께 자체 세션 엔진을 사용하는 것입니다.

+0

그게 좋은 팁은 cron :)에서 멀리 보관하지만 어쩌면 세션이 만료되면, 어쩌면 세션 파일을 통해 알 수 있어야합니다. 그것의 창조의 날짜를 경과 된 시간과 비교한다. –

+0

파일 시간 초과를 테스트하는 것이 더 간단하지 않습니까? 세션에 최종 액세스 권한을 저장하면 이전 세션을 종료 할 수 있습니다 (예, 2 일 동안 한 세션 만 유지할 수 있음). – SergeS

2

나는 똑같은 일을하려하고있다. 한 가지 해결책은 session_set_save_handler()으로 사용자 지정 가비지 수집기 기능을 정의하는 것입니다. 이 사용자 지정 함수에서 세션과 관련된 업로드 된 파일을 삭제 한 다음 디스크에서 세션을 삭제합니다. 당신이 세션을 처리하는 PHP에 의존하지 않는 경우

bool session_set_save_handler (callback $open, 
           callback $close, 
           callback $read, 
           callback $write, 
           callback $destroy, 
           callback $gc) 

이 쉽다 : 나는 그것을 볼 수있는 유일한 문제는 당신이뿐만 아니라 세션 핸들러의 나머지 부분을 정의해야 할 것입니다. 커스텀 핸들러 함수에서 PHP의 기본 핸들러 함수를 호출하는 방법이 있습니까?

관련 문제